{"id":48101,"date":"2023-05-19T13:11:42","date_gmt":"2023-10-30T16:09:39","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/"},"modified":"2024-04-30T04:55:20","modified_gmt":"2024-04-29T20:55:20","slug":"%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/","title":{"rendered":"\u4f7f\u7528 Apollo \u670d\u52a1\u5668\u548c Prisma \u5b9e\u73b0 JWT \u8ba4\u8bc1"},"content":{"rendered":"<h1>\u9996\u5148<\/h1>\n<p>\u672c\u6587\u6863\u662f\u5173\u4e8e\u5728GraphQL\u4e2d\u4f7f\u7528JWT\u8fdb\u884c\u7528\u6237\u8eab\u4efd\u9a8c\u8bc1\u7684\u6d4b\u8bd5\u5907\u5fd8\u5f55\u3002<\/p>\n<h2>Prisma\u662f\u4ec0\u4e48\uff1f<\/h2>\n<p>\u8fd9\u662f\u4e00\u79cd\u5c06GraphQL\u670d\u52a1\u5668\uff08\u672c\u6587\u4f7f\u7528Apollo\u4f5c\u4e3aGraphQL\u670d\u52a1\u5668\uff09\u548c\u6570\u636e\u5e93\u8fde\u63a5\u7684ORM\u3002<\/p>\n<p>ORM \u6307\u7684\u662f\u4e0b\u5217\u529f\u80fd\u7684\u6574\u5408\u3002<\/p>\n<blockquote><p>1. \u4ece\u6570\u636e\u5e93\u4e2d\u83b7\u53d6\u6570\u636e\u3002<br \/>\n2. \u5c06\u83b7\u53d6\u7684\u6570\u636e\u8f6c\u6362\u4e3a\u5bf9\u8c61\u3002<br \/>\n3. \u5c06\u6570\u636e\u7684\u66f4\u65b0\u3001\u4fee\u6539\u7b49\u5b58\u50a8\u5230\u6570\u636e\u5e93\u4e2d\u3002<\/p><\/blockquote>\n<p>\u53c2\u8003\uff1a\u56e0\u4e3a\u60f3\u8981\u66f4\u52a0\u719f\u7ec3\u5730\u4f7f\u7528ORM\uff0c\u6240\u4ee5\u91cd\u65b0\u5ba1\u89c6\u4e86\u4e00\u4e0b\u3002<\/p>\n<h2>JWT\u662f\u4ec0\u4e48\uff1f<\/h2>\n<p>JWT\uff08JSON Web Token\uff09\u662fJSON Web\u4ee4\u724c\u7684\u7f29\u5199\uff0c\u6307\u7684\u662f\u5728JSON\u6570\u636e\u4e0a\u5e94\u7528\u7b7e\u540d\u548c\u52a0\u5bc6\u7684\u65b9\u6cd5\u3002<br \/>\n\u672c\u6587\u5c06\u4ecb\u7ecd\u5176\u5728\u767b\u5f55\u8ba4\u8bc1\u4e2d\u7684\u5e94\u7528\u3002<br \/>\n\u8bf7\u70b9\u51fb\u8fd9\u91cc\u67e5\u770b\u8be6\u7ec6\u4fe1\u606f\u3002<\/p>\n<h2>Prisma\u7684\u8bbe\u7f6e<\/h2>\n<p>\u6211\u4eec\u7acb\u5373\u4ecePrisma\u7684\u8bbe\u7f6e\u5f00\u59cb\u5427?<\/p>\n<pre class=\"post-pre\"><code>$ mkdir jwt-Auth\r\n$ cd jwt-Auth\r\n$ npm init\r\n$ npm install apollo-server graphql  prisma-client-lib\r\n$ npm install -g prisma\r\n<\/code><\/pre>\n<p>\u5b8c\u6210npm\u5b89\u88c5\u540e\uff0c\u5c06\u5728\u9879\u76ee\u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u4ee5\u4fbf\u4f7f\u7528Prisma\u3002<\/p>\n<pre class=\"post-pre\"><code>$ prisma init\r\n<\/code><\/pre>\n<p>\u76f4\u63a5\u4f7f\u7528Docker\uff0c\u5e76\u8fdb\u884cPrisma\u914d\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code>? Set up a new Prisma server or deploy to an existing server? \r\n\u276f Create new database                 Set up a local database using Docker \r\n? What kind of database do you want to deploy to? \r\n\u276f PostgreSQL        PostgreSQL database \r\n? Select the programming language for the generated Prisma client \r\n\u276f Prisma JavaScript Client\r\n<\/code><\/pre>\n<p>\u5f53\u4f60\u6210\u529f\u65f6\uff0c\u5c06\u663e\u793a\u4ee5\u4e0b\u7684\u6307\u5f15\u3002<\/p>\n<pre class=\"post-pre\"><code>Created 3 new files:                                                                          \r\n\r\n  prisma.yml           Prisma service definition\r\n  datamodel.graphql    GraphQL SDL-based datamodel (foundation for database)\r\n  docker-compose.yml   Docker configuration file\r\n\r\nNext steps:\r\n\r\n  1. Start your Prisma server: docker-compose up -d\r\n  2. Deploy your Prisma service: prisma deploy\r\n  3. Read more about Prisma server:\r\n<\/code><\/pre>\n<h3>\u542f\u52a8Docker\u5bb9\u5668<\/h3>\n<p>\u5728\u542f\u52a8Docker\u5bb9\u5668\u4e4b\u524d\uff0c\u5bf9\u751f\u6210\u7684\u6587\u4ef6\u8fdb\u884c\u914d\u7f6e\u66f4\u6539\u3002<\/p>\n<p>\u8bf7\u53d6\u6d88\u6ce8\u91cadocker-compose.yml\u6587\u4ef6\u4e2d\u5173\u4e8e\u7aef\u53e3\u8bbe\u7f6e\u7684\u90e8\u5206\u3002<br \/>\n\u5982\u679c\u4fdd\u6301\u6ce8\u91ca\u72b6\u6001\uff0c\u5c06\u65e0\u6cd5\u5728\u672c\u5730\u4e3b\u673a\u4e0a\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\"># Uncomment the next two lines to connect to your your database from outside the Docker environment, e.g. using a database GUI like Postico<\/span>\r\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">5432:5432\"<\/span>\r\n<\/code><\/pre>\n<p>\u6211\u5c06\u4f1a\u4fee\u6539datamodel.graphql\u6587\u4ef6\u3002\u8fd9\u4e2a\u6587\u4ef6\u662f\u4f5c\u4e3aORM\uff08\u5bf9\u8c61\u5173\u7cfb\u6620\u5c04\uff09\u6240\u5fc5\u9700\u7684\u6587\u4ef6\u7684\u57fa\u7840\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">type<\/span> <span class=\"n\">User<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"nb\">ID<\/span><span class=\"p\">!<\/span> <span class=\"err\">@<\/span><span class=\"n\">id<\/span>\r\n  <span class=\"n\">name<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">!<\/span>\r\n  <span class=\"n\">email<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">!<\/span> <span class=\"err\">@<\/span><span class=\"n\">unique<\/span>\r\n  <span class=\"n\">password<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">!<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u2462\u8bf7\u4e0d\u8981\u66f4\u6539prisma.yml\uff0c\u4ee5\u4e0b\u662f\u914d\u7f6e\u6587\u4ef6\u7684\u5185\u5bb9\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">endpoint<\/span><span class=\"pi\">:<\/span> <span class=\"s\">http:\/\/localhost:4466<\/span>\r\n<span class=\"na\">datamodel<\/span><span class=\"pi\">:<\/span> <span class=\"s\">datamodel.prisma<\/span>\r\n\r\n<span class=\"na\">generate<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"pi\">-<\/span> <span class=\"na\">generator<\/span><span class=\"pi\">:<\/span> <span class=\"s\">javascript-client<\/span>\r\n    <span class=\"na\">output<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/generated\/prisma-client\/<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u51c6\u5907\u597d\u4e4b\u540e\uff0c\u8bf7\u6309\u7167\u5148\u524d\u63d0\u4f9b\u7684\u201c\u4e0b\u4e00\u6b65\u201d\u6307\u5357\u542f\u52a8\u5bb9\u5668\u3002<\/p>\n<pre class=\"post-pre\"><code>$ docker-compose up -d \r\n$ prisma deploy\r\n$ prisma generate\r\n<\/code><\/pre>\n<p>\u5f53\u6210\u529f\u6267\u884c\u4ee5\u4e0a\u547d\u4ee4\u65f6\uff0c\u5c06\u4f1a\u521b\u5efa\u6240\u9700\u7684\u6587\u4ef6\uff0c\u4ee5\u4f5c\u4e3a\u7531datamodel.prisma\u6587\u4ef6\u751f\u6210\u7684ORM\u7684\u529f\u80fd\u3002<\/p>\n<p>\u5982\u679c\u5c06Prisma\u5b9e\u4f8b\u5bfc\u5165\u5230\u6587\u4ef6\u4e2d\uff0c\u90a3\u4e48\u5728\u6267\u884cQuery\u548cMutation\u65f6\uff0c\u5c31\u53ef\u4ee5\u8bbf\u95ee\u6570\u636e\u5e93\u3002<\/p>\n<pre class=\"post-pre\"><code>const { prisma } = require('.\/generated\/prisma-client')\r\n<\/code><\/pre>\n<h2>\u7f16\u5199\u4e0eApollo\u670d\u52a1\u5668\u76f8\u5173\u7684\u4ee3\u7801<\/h2>\n<p>\u5b8c\u6210 Prisma \u8bbe\u7f6e\u540e\uff0c\u6211\u4eec\u5c06\u51c6\u5907\u4f7f\u7528 Apollo \u4f5c\u4e3a GraphQL \u670d\u52a1\u5668\u3002bcrypt \u662f\u7528\u4e8e\u5bc6\u7801\u54c8\u5e0c\u5904\u7406\u7684\u5e93\u3002<\/p>\n<pre class=\"post-pre\"><code>$ mkdir resolver \r\n$ touch index.js schema.js  resolver\/Mutation.js \r\n$ npm install bcrypt jsonwebtoken\r\n<\/code><\/pre>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u8981\u5b9a\u4e49\u6a21\u5f0f\u3002<\/p>\n<pre class=\"post-pre\"><code>\r\n<span class=\"kd\">const<\/span> <span class=\"p\">{<\/span><span class=\"nx\">gql<\/span><span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">apollo-server<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">typeDefs<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">gql<\/span><span class=\"s2\">`\r\ntype Query {\r\n  users(query: String): [User!]!\r\n}\r\n\r\ntype Mutation {\r\n  createUser(data: CreateUserInput!): AuthPayload!\r\n  login(data: LoginUserInput!): AuthPayload!\r\n}\r\n\r\ntype AuthPayload {\r\n  token: String!\r\n  user: User!\r\n}\r\n\r\ninput CreateUserInput {\r\n  name: String!\r\n  email: String!\r\n  password: String!\r\n}\r\n\r\ninput LoginUserInput {\r\n  email: String!\r\n  password: String!\r\n}\r\n\r\ntype User {\r\n  id: ID!\r\n  name: String!\r\n  email: String\r\n  password: String!\r\n}\r\n`<\/span>\r\n<span class=\"nx\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">exports<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">typeDefs<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u6211\u4eec\u5728\u8fd9\u91cc\u4f7f\u7528JWT\u548cbcrypt\u3002<br \/>\nPrisma\u5c06\u5728\u6240\u6709\u89e3\u6790\u5668\u4e4b\u95f4\u5171\u4eab\uff0c\u4f5c\u4e3a\u7b2c\u4e09\u4e2a\u53c2\u6570\u7684\u4e0a\u4e0b\u6587\u6765\u4f7f\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kd\">const<\/span> <span class=\"nx\">bcrypt<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">bcrypt<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">jwt<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">jsonwebtoken<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">Mutation<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">async<\/span> <span class=\"nx\">createUser<\/span><span class=\"p\">(<\/span><span class=\"nx\">parent<\/span><span class=\"p\">,<\/span> <span class=\"nx\">args<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">prisma<\/span> <span class=\"p\">},<\/span> <span class=\"nx\">info<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"na\">data<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">email<\/span><span class=\"p\">,<\/span> <span class=\"nx\">name<\/span><span class=\"p\">,<\/span> <span class=\"nx\">password<\/span> <span class=\"p\">}<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">args<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"kd\">const<\/span> <span class=\"nx\">newUser<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">prisma<\/span><span class=\"p\">.<\/span><span class=\"nx\">createUser<\/span><span class=\"p\">({<\/span>\r\n          <span class=\"nx\">email<\/span><span class=\"p\">,<\/span>\r\n          <span class=\"nx\">name<\/span><span class=\"p\">,<\/span>\r\n          <span class=\"c1\">\/\/ bcrypt\u3067\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u30cf\u30c3\u30b7\u30e5\u5316<\/span>\r\n          <span class=\"na\">password<\/span><span class=\"p\">:<\/span> <span class=\"nx\">bcrypt<\/span><span class=\"p\">.<\/span><span class=\"nx\">hashSync<\/span><span class=\"p\">(<\/span><span class=\"nx\">password<\/span><span class=\"p\">,<\/span> <span class=\"mi\">3<\/span><span class=\"p\">)<\/span>\r\n        <span class=\"p\">});<\/span>\r\n          <span class=\"c1\">\/\/ \u30b5\u30fc\u30d0\u30fc\u304cJWT\u30c8\u30fc\u30af\u30f3\u3092\u767a\u884c<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"p\">{<\/span><span class=\"na\">token<\/span> <span class=\"p\">:<\/span> <span class=\"nx\">jwt<\/span><span class=\"p\">.<\/span><span class=\"nx\">sign<\/span><span class=\"p\">(<\/span><span class=\"nx\">newUser<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">supersecret<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)};<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"k\">async<\/span> <span class=\"nx\">login<\/span><span class=\"p\">(<\/span><span class=\"nx\">parent<\/span><span class=\"p\">,<\/span> <span class=\"nx\">args<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">prisma<\/span> <span class=\"p\">},<\/span> <span class=\"nx\">info<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"na\">data<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">email<\/span><span class=\"p\">,<\/span> <span class=\"nx\">password<\/span> <span class=\"p\">}<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">args<\/span><span class=\"p\">;<\/span>\r\n         <span class=\"c1\">\/\/ \u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9\u3068\u7167\u5408<\/span>\r\n        <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span> <span class=\"nx\">signInUser<\/span> <span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">prisma<\/span><span class=\"p\">.<\/span><span class=\"nx\">users<\/span><span class=\"p\">({<\/span>\r\n          <span class=\"na\">where<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nx\">email<\/span>\r\n          <span class=\"p\">}<\/span>\r\n        <span class=\"p\">})<\/span>\r\n       <span class=\"c1\">\/\/ console.log(signInUser) \u8a72\u5f53\u30e6\u30fc\u30b6\u30fc\u306eid,name,email,password\u304c\u683c\u7d0d\u3055\u308c\u3066\u3044\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">signInUser<\/span><span class=\"p\">)<\/span> <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nb\">Error<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Unable to Login<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\r\n         <span class=\"c1\">\/\/ \u6697\u53f7\u5316\u3055\u308c\u305f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u683c\u7d0d\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3068\u7167\u5408<\/span>\r\n        <span class=\"kd\">const<\/span> <span class=\"nx\">isMatch<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">bcrypt<\/span><span class=\"p\">.<\/span><span class=\"nx\">compareSync<\/span><span class=\"p\">(<\/span><span class=\"nx\">password<\/span><span class=\"p\">,<\/span> <span class=\"nx\">signInUser<\/span><span class=\"p\">.<\/span><span class=\"nx\">password<\/span><span class=\"p\">);<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"o\">!<\/span><span class=\"nx\">isMatch<\/span><span class=\"p\">)<\/span> <span class=\"k\">throw<\/span> <span class=\"k\">new<\/span> <span class=\"nb\">Error<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">Unable to Login<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\r\n         <span class=\"c1\">\/\/ \u4e00\u81f4\u3057\u305f\u5834\u5408\u3001\u65b0\u3057\u3044\u30e6\u30fc\u30b6\u8a8d\u8a3c\u30c8\u30fc\u30af\u30f3\u3092\u623b\u308a\u5024\u3068\u3057\u3066\u8fd4\u3059<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"p\">{<\/span><span class=\"na\">token<\/span> <span class=\"p\">:<\/span> <span class=\"nx\">jwt<\/span><span class=\"p\">.<\/span><span class=\"nx\">sign<\/span><span class=\"p\">(<\/span><span class=\"nx\">signInUser<\/span><span class=\"p\">,<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">supersecret<\/span><span class=\"dl\">\"<\/span><span class=\"p\">)};<\/span>\r\n    <span class=\"p\">},<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">exports<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">Mutation<\/span>\r\n<\/code><\/pre>\n<p>\u6211\u5011\u4f86\u5beb\u6700\u5f8c\u4e00\u6b65\uff0c\u5373\u555f\u52d5Apollo\u670d\u52d9\u5668\uff08GraphQL\u670d\u52d9\u5668\uff09\u7684\u8a2d\u7f6e\u8655\u7406\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ApolloServer<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">apollo-server<\/span><span class=\"dl\">'<\/span><span class=\"p\">);<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">Mutation<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">.\/resolver\/Mutation<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">typeDefs<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">.\/schema<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\r\n<span class=\"c1\">\/\/ datamodel.prisma\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u751f\u6210\u3055\u308c\u305fPrisma\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9<\/span>\r\n<span class=\"kd\">const<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">prisma<\/span> <span class=\"p\">}<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">.\/generated\/prisma-client<\/span><span class=\"dl\">'<\/span><span class=\"p\">)<\/span>\r\n\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">server<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">ApolloServer<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">typeDefs<\/span><span class=\"p\">:<\/span> <span class=\"nx\">typeDefs<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">resolvers<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">Mutation<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"na\">context<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">prisma<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">})<\/span>\r\n\r\n<span class=\"nx\">server<\/span><span class=\"p\">.<\/span><span class=\"nx\">listen<\/span><span class=\"p\">().<\/span><span class=\"nx\">then<\/span><span class=\"p\">(({<\/span> <span class=\"nx\">url<\/span><span class=\"p\">})<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"s2\">`? Server ready at <\/span><span class=\"p\">${<\/span><span class=\"nx\">url<\/span><span class=\"p\">}<\/span><span class=\"s2\">`<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">});<\/span>\r\n<\/code><\/pre>\n<h2>\u5728GraphQL IDE\u4e2d\u8fdb\u884c\u6d4b\u8bd5<\/h2>\n<p>\u4f7f\u7528GraphQL IDE\u8fdb\u884c\u6d4b\u8bd5\u3002<\/p>\n<pre class=\"post-pre\"><code>$ node index.js\r\n? Server ready at http:\/\/localhost:4000\/\r\n<\/code><\/pre>\n<h4>\u6ce8\u518c<\/h4>\n<p>\u6211\u5c06\u5728IDE\u4e0a\u7f16\u5199\u4e00\u4e2a\u67e5\u8be2\uff0c\u5176\u4e2d\u5305\u542b\u540d\u79f0\u3001\u7535\u5b50\u90ae\u4ef6\u548c\u5bc6\u7801\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d832c913a08637a6b2da3\/46-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2020-10-27 1.44.28.png\" \/><\/div>\n<p>\u8fd4\u56de\u4e86JWT\u4ee4\u724c\u3002<\/p>\n<h4>\u767b\u5165 r\u00f9)<\/h4>\n<p>\u63a5\u4e0b\u6765\u662f\u7b7e\u5230\u786e\u8ba4\u3002<br \/>\n\u4e0e\u6ce8\u518c\u76f8\u540c\uff0c\u5c06\u7535\u5b50\u90ae\u4ef6\u548c\u5bc6\u7801\u5199\u5728\u67e5\u8be2\u4e2d\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d832c913a08637a6b2da3\/50-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2020-10-27 1.46.10.png\" \/><\/div>\n<p>\u6210\u529f\uff01\u8fd4\u56de\u7684JWT\u4ee4\u724c\u4e0e\u6ce8\u518c\u65f6\u76f8\u540c\uff01<\/p>\n<h3>\u6700\u540e<\/h3>\n<p>\u6211\u5c1d\u8bd5\u5728GraphQL\u4e2d\u6d4b\u8bd5\u4e86\u767b\u5f55\u8ba4\u8bc1\u529f\u80fd\uff0c\u5229\u7528Prisma\u548cDocker\u53ef\u4ee5\u5feb\u901f\u642d\u5efa\u73af\u5883\uff0c\u63a5\u4e0b\u6765\u51e0\u4e4e\u65e0\u9700\u610f\u8bc6\uff0c\u53ef\u4ee5\u8f7b\u677e\u7f16\u5199\u4ee3\u7801\uff0c\u8fd9\u6b63\u662fGraphQL\u7684\u4f18\u52bf\u6240\u5728\u3002<\/p>\n<p>\u90a3\u4e48\uff0c\u518d\u89c1?<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u672c\u6587\u6863\u662f\u5173\u4e8e\u5728GraphQL\u4e2d\u4f7f\u7528JWT\u8fdb\u884c\u7528\u6237\u8eab\u4efd\u9a8c\u8bc1\u7684\u6d4b\u8bd5\u5907\u5fd8\u5f55\u3002 Prisma\u662f\u4ec0\u4e48\uff1f \u8fd9\u662f\u4e00\u79cd\u5c06 [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48101","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528 Apollo \u670d\u52a1\u5668\u548c Prisma \u5b9e\u73b0 JWT \u8ba4\u8bc1 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528-apollo-\u670d\u52a1\u5668\u548c-prisma-\u5b9e\u73b0-jwt-\u8ba4\u8bc1\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528 Apollo \u670d\u52a1\u5668\u548c Prisma \u5b9e\u73b0 JWT \u8ba4\u8bc1\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u672c\u6587\u6863\u662f\u5173\u4e8e\u5728GraphQL\u4e2d\u4f7f\u7528JWT\u8fdb\u884c\u7528\u6237\u8eab\u4efd\u9a8c\u8bc1\u7684\u6d4b\u8bd5\u5907\u5fd8\u5f55\u3002 Prisma\u662f\u4ec0\u4e48\uff1f \u8fd9\u662f\u4e00\u79cd\u5c06 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528-apollo-\u670d\u52a1\u5668\u548c-prisma-\u5b9e\u73b0-jwt-\u8ba4\u8bc1\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-30T16:09:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T20:55:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d832c913a08637a6b2da3\/46-0.png\" \/>\n<meta name=\"author\" content=\"\u79d1, \u9896\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u9896\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/\",\"name\":\"\u4f7f\u7528 Apollo \u670d\u52a1\u5668\u548c Prisma \u5b9e\u73b0 JWT \u8ba4\u8bc1 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-10-30T16:09:39+00:00\",\"dateModified\":\"2024-04-29T20:55:20+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528 Apollo \u670d\u52a1\u5668\u548c Prisma \u5b9e\u73b0 JWT \u8ba4\u8bc1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e\",\"name\":\"\u79d1, \u9896\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u9896\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keying\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528 Apollo \u670d\u52a1\u5668\u548c Prisma \u5b9e\u73b0 JWT \u8ba4\u8bc1 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528-apollo-\u670d\u52a1\u5668\u548c-prisma-\u5b9e\u73b0-jwt-\u8ba4\u8bc1\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528 Apollo \u670d\u52a1\u5668\u548c Prisma \u5b9e\u73b0 JWT \u8ba4\u8bc1","og_description":"\u9996\u5148 \u672c\u6587\u6863\u662f\u5173\u4e8e\u5728GraphQL\u4e2d\u4f7f\u7528JWT\u8fdb\u884c\u7528\u6237\u8eab\u4efd\u9a8c\u8bc1\u7684\u6d4b\u8bd5\u5907\u5fd8\u5f55\u3002 Prisma\u662f\u4ec0\u4e48\uff1f \u8fd9\u662f\u4e00\u79cd\u5c06 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528-apollo-\u670d\u52a1\u5668\u548c-prisma-\u5b9e\u73b0-jwt-\u8ba4\u8bc1\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-10-30T16:09:39+00:00","article_modified_time":"2024-04-29T20:55:20+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d832c913a08637a6b2da3\/46-0.png"}],"author":"\u79d1, \u9896","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u9896","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"2 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/","name":"\u4f7f\u7528 Apollo \u670d\u52a1\u5668\u548c Prisma \u5b9e\u73b0 JWT \u8ba4\u8bc1 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-10-30T16:09:39+00:00","dateModified":"2024-04-29T20:55:20+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528 Apollo \u670d\u52a1\u5668\u548c Prisma \u5b9e\u73b0 JWT \u8ba4\u8bc1"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/8ca01ba7f7362ad4edb7da206a12f29e","name":"\u79d1, \u9896","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8a6fb3cc7ba2f69d2189ba532aec4633ea7ed75ac0af162ec367cb3abc0fb2af?s=96&d=mm&r=g","caption":"\u79d1, \u9896"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keying\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8-apollo-%e6%9c%8d%e5%8a%a1%e5%99%a8%e5%92%8c-prisma-%e5%ae%9e%e7%8e%b0-jwt-%e8%ae%a4%e8%af%81%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48101","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48101"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48101\/revisions"}],"predecessor-version":[{"id":89815,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48101\/revisions\/89815"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48101"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48101"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48101"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}