{"id":841,"date":"2023-11-28T09:36:29","date_gmt":"2023-11-28T01:36:29","guid":{"rendered":"http:\/\/152.136.136.144\/?p=841"},"modified":"2023-11-28T09:36:29","modified_gmt":"2023-11-28T01:36:29","slug":"nest%e8%b5%b7%e6%89%8b%e5%bc%8f","status":"publish","type":"post","link":"https:\/\/gjweb.top\/?p=841","title":{"rendered":"nest\u8d77\u624b\u5f0f"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">\u5b89\u88c5\u811a\u624b\u67b6<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>npm install -g @nestjs\/cli\nnest new projectName<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u9879\u76ee\u76ee\u5f55\u521b\u5efa<\/h2>\n\n\n\n<p>\u5220\u9664 src \u4e2d\u591a\u4f59\u7684\u6587\u4ef6\u53ea\u4fdd\u7559 <code>app.module.ts<\/code> \u548c <code>main.ts<\/code><\/p>\n\n\n\n<p>\u91cd\u7f6e app.module.ts \u6587\u4ef6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { Module } from '@nestjs\/common';\n@Module({\n  imports: &#91;],\n  controllers: &#91;],\n  providers: &#91;],\n})\nexport class AppModule {}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u521b\u5efa\u76f8\u5173\u6a21\u5757<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>nest g module user \/*\u521b\u5efauser\u7684module*\/\nnest g controller User --no-spec \/*\u521b\u5efa controller \u5c42\uff0c\u5ffd\u7565\u6d4b\u8bd5\u6587\u4ef6*\/\nnest g service user --no-spec \/*\u521b\u5efa service \u5c42\uff0c\u5ffd\u7565\u6d4b\u8bd5\u6587\u4ef6*\/\nnest g resource use --no-spec \/*\u521b\u5efa\u6a21\u7248(\u4e09\u5408\u4e00),\u5ffd\u7565\u6d4b\u8bd5\u6587\u4ef6*\/<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">module \u3001controller \u548c service \u4e09\u8005\u7684\u5173\u7cfb<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>controller (\u63a7\u5236\u5668)\uff1a\u8d1f\u8d23\u5904\u7406HTTP\u8bf7\u6c42\u548c\u54cd\u5e94\uff0c\u63a5\u53d7\u6765\u81ea\u5ba2\u6237\u7aef\u7684\u8bf7\u6c42\uff0c\u5e76\u5c06\u5176\u59d4\u6d3e\u7ed9 service \u8fdb\u884c\u5904\u7406\u3002controller \u4e2d\u5b9a\u4e49\u4e86\u8def\u7531\u548c\u5904\u7406\u8bf7\u6c42\u7684\u65b9\u5f0f<\/li>\n\n\n\n<li>Module\uff08\u6a21\u5757\uff09\uff1a\u5e94\u7528\u7a0b\u5e8f\u7684\u6838\u5fc3\u7ec4\u7ec7\u5355\u5143\uff0c\u8d1f\u8d23\u5c06\u5e94\u7528\u7a0b\u5e8f\u7684\u4e0d\u540c\u90e8\u5206\u7ec4\u5408\u5728\u4e00\u8d77\uff0c\u6bcf\u4e00\u4e2a Module \u90fd\u6709\u81ea\u5df1\u7684 Controller\u3001Service \u548c \u5176\u4ed6\u76f8\u5173\u7ec4\u4ef6\uff0c\u4ed6\u4eec\u6574\u4f53\u6784\u6210\u4e86\u4e00\u4e2a\u6a21\u5757<\/li>\n\n\n\n<li>Service \uff08\u670d\u52a1\uff09\uff1a\u5e94\u7528\u7a0b\u5e8f\u7684\u4e1a\u52a1\u903b\u8f91\u96c6\u4e2d\u5730\uff0c\u4ed6\u5305\u542b\u4e86\u5904\u7406\u4e1a\u52a1\u903b\u8f91\u7684\u65b9\u6cd5\uff0cService \u88ab Controller \u8c03\u7528\uff0c\u7528\u4e8e\u5904\u7406\u6765\u81ea\u5ba2\u6237\u7aef\u7684\u8bf7\u6c42\uff0c\u5e76\u8fd4\u56de\u7ed3\u679c\uff0cService \u53ef\u4ee5\u88ab\u591a\u4e2a COntroller \u548c\u5176\u4ed6\u7684 Service \u5171\u4eab<\/li>\n<\/ul>\n\n\n\n<p>Nest\u63d0\u4f9b\u4e86\u7ed3\u6784\u5316\u7684\u65b9\u5f0f\u6765\u7ec4\u7ec7\u5e94\u7528\u7a0b\u5e8f\uff0c\u5c06\u4e0d\u540c\u7684\u529f\u80fd\u6a21\u5757\u5206\u5f00\u7ba1\u7406<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u63a5\u53e3\u7684\u7248\u672c\u63a7\u5236<\/h2>\n\n\n\n<p><code>main.ts<\/code>\u4e2d\u914d\u7f6e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>async function bootstrap() {\n  const app = await NestFactory.create(AppModule);\n  app.enableVersioning({ \/*\u914d\u7f6e\u7248\u672c\u53f7*\/\n    type:VersioningType.URI\n  })\n  await app.listen(3000);\n}<\/code><\/pre>\n\n\n\n<p>\u5728\u6587\u4ef6\u7684 <code>controller<\/code> \u6587\u4ef6\u8bbe\u7f6e\u5957\u63a5\u53e3\u7684\u7248\u672c\u53f7<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Controller({\n  path:'user',\n  version:'1'\n})\nexport class UserController{\n    ...\n}\n\n\/**\u5728\u8fd9\u67d0\u4e2a\u63a5\u53e3\u7684\u7248\u672c\u53f7*\/\n@Controller('user')\nexport class UserController{\n  @Get()\n  @Version(\"1\")\n  findAll() {\n    return this.userService.findAll();\n  }\n}<\/code><\/pre>\n\n\n\n<p>\u8bbf\u95ee\u8def\u5f84 <code>localhost:3000\/v1\/user<\/code><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u63a7\u5236\u5668&#8211;\u63a5\u53d7get\u548cpost\u53c2\u6570<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u5e38\u7528\u63a7\u5236\u5668<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>\u63a7\u5236\u5668<\/th><th>\u63cf\u8ff0<\/th><\/tr><\/thead><tbody><tr><td>@Request()<\/td><td>\u8bf7\u6c42\u7684\u5168\u90e8\u4fe1\u606f<\/td><\/tr><tr><td>@Query()<\/td><td>\u67e5\u8be2\u5b57\u7b26\u4e32\u4fe1\u606f<\/td><\/tr><tr><td>@Body()<\/td><td>\u8bf7\u6c42\u4f53\u4fe1\u606f<\/td><\/tr><tr><td>@Header()<\/td><td>\u83b7\u53d6\u8bf7\u6c42\u5934<\/td><\/tr><tr><td>@HttpCode()<\/td><td>\u8bbe\u7f6e\u63a5\u53e3\u72b6\u6001\u7801<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u7528\u6cd5\u793a\u4f8b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Post(\":id\")\n@HttpCode(200)\npostFun(\n    @Requery() req,\n    @Query() query,\n    @Body() body,\n    @Header() header,\n    @Param(\"id\") id\n){\n    console.log(req) \/*\u91cc\u9762\u5305\u542b\u4e86query,body,header,params \u7684\u6240\u6709\u53c2\u6570*\/\n    console.log(query) \/*\u53ea\u83b7\u53d6query*\/\n    console.log(body) \/*\u53ea\u83b7\u53d6body*\/\n    console.log(header)\/*\u53ea\u83b7\u53d6header*\/\n    console.log(id) \/*\u53ea\u83b7\u53d6\u6a21\u7248\u53c2\u6570*\/\n    reurn {code:101} \n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u8bbe\u7f6esession<\/h3>\n\n\n\n<p>\u5b89\u88c5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn add express-session @types\/express-session <\/code><\/pre>\n\n\n\n<p>\u914d\u7f6e <code>main.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>app.use(session({\n    secret:\"demo\", \/*\u7b7e\u540d&#91;\u81ea\u5b9a\u4e49]*\/\n    rolling:true, \/*\u5f3a\u5236\u8bbe\u7f6ecookie,\u91cd\u7f6e\u8fc7\u671f\u65f6\u95f4*\/\n    name:\"demo.sid\", \/*session\u7684\u5b57\u6bb5\u540d\u79f0*\/\n    cookie:{maxAge:999999} \/*\u8fc7\u671f\u7684\u79d2\u6570*\/\n }))<\/code><\/pre>\n\n\n\n<p>\u5728 <code>controller<\/code>\u4e2d\u4f7f\u7528 session<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Get()\ngetUser(@Session() session){\n    session.name = \"\u5f20\u4e09\" \/*\u8bbe\u7f6esession*\/\n    return {code:101}\n}\n\n@Get()\ngetSession(@Session session){\n    console.log(session.name) \/*\u6253\u5370session*\/\n    return {code:101}\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u6a21\u5757 @Module<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u5171\u4eab\u6a21\u5757<\/h3>\n\n\n\n<p>\u5982\u679c <code>a.controller.ts<\/code> \u60f3\u4f7f\u7528 <code>b.service.ts<\/code> \u7684\u901a\u7528\u903b\u8f91\u65f6,\u8981\u5728 <code>b.module.ts<\/code> \u4e2d\u5bfc\u51fa\u8be5 Service \u7c7b, \u5728\u8fd9\u91cc\u914d\u7f6e <code>b.module.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Module({\n  ...\n  exports:&#91;BService]\/*\u5bfc\u51faBService\u7c7b*\/\n})<\/code><\/pre>\n\n\n\n<p>\u5728<code>a.controller.ts<\/code> \u76f4\u63a5\u5f15\u7528<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import {BService} from \"b.service\";\nimport { Controller, Get } from '@nestjs\/common';\n@Controller()\nexport class AController {\n  constructor(\n    private readonly aScrvice: AScrvice,\n    private readonly bService:UserService\n    ) {}\n\n  @Get()\n  getHello(): string {\n    return this.bService.findAll();\n  }\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u4e2d\u95f4\u4ef6<\/h2>\n\n\n\n<p>\u8def\u7531\u5904\u7406\u7a0b\u5e8f\u4e4b\u524d\u8c03\u7528\u7684\u7a0b\u5e8f,\u4e2d\u95f4\u4ef6\u51fd\u6570\u53ef\u4ee5\u8bbf\u95ee\u8bf7\u6c42\u5bf9\u8c61\u548c\u54cd\u5e94\u5bf9\u8c61\uff08\u7c7b\u4f3c\u4e8eaxios\u7684\u62e6\u622a\u5668\uff09<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u89e3\u51b3\u8de8\u57df\u95ee\u9898<\/h3>\n\n\n\n<p>\u5b89\u88c5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn add cors @types\/cors <\/code><\/pre>\n\n\n\n<p>\u914d\u7f6e <code>main.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import * as cors from \"cors\";\nasync function bootstrap() {\n  const app = await NestFactory.create(AppModule);\n  app.use(cors())\n  ....\n  await app.listen(3000);\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u6587\u4ef6\u4e0a\u4f20<\/h2>\n\n\n\n<p>\u5b89\u88c5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn add multer @types\/multer<\/code><\/pre>\n\n\n\n<p>\u5728 <code>upload.module.ts<\/code> \u6307\u5b9a\u5b58\u50a8\u8def\u5f84<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Module({\n    imports:&#91;\n        MulterModule.register({\n          storage:diskStorage({\n            destination:join(\".\/public\/uploaded\"), \/**\u5b58\u653e\u76ee\u5f55 *\/\n            filename:(_,file,callback) =&gt; { \/*\u65f6\u95f4\u6233\u5b9a\u4e49\u6587\u4ef6\u540d*\/\n                const fileName = `${new Date().getTime() + extname(file.originalname)}`\n                return callback(null,fileName)\n            }\n          })\n        })\n    ]\n})<\/code><\/pre>\n\n\n\n<p>\u63a5\u53e3\u7aef <code>upload.controller.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Controller('upload')\nexport class UploadController {\n  constructor(private readonly uploadService: UploadService) {}\n\n  @Post()\n  @UseInterceptors(FilesInterceptor(\"files\"))\n  create(@UploadedFiles() files) {\n    console.log(files)\n    return {code:101}\n  }\n\n}<\/code><\/pre>\n\n\n\n<p>\u7ed9 <code>public\/uploaded<\/code> \u6587\u4ef6\u914d\u7f6e\u9759\u6001\u8d44\u6e90\uff0c\u4f9b\u5916\u90e8\u8bbf\u95ee\uff0c\u5728<code>upload.module.ts<\/code>\u914d\u7f6e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Module({\n    imports:&#91;\n        ...\n        ServeStaticModule.forRoot({\n          rootPath: join('.\/', 'public\/uploaded'),\n        })\n    ]\n})<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u6587\u4ef6\u6d41\u4e0b\u8f7d<\/h2>\n\n\n\n<p>\u5b89\u88c5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn add compressing<\/code><\/pre>\n\n\n\n<p>\u63a5\u53e3\u5c42<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>  @Get(\"steamDown\")\n  async steamDown(@Res() res){\n    const url = join(\".\/public\/uploaded\");\n    const tarStream = new zip.Stream();\n    await tarStream.addEntry(url);\n    res.setHeader(\"Content-Type\",\"application\/octet-stream\")\n    res.setHeader(\"Content-Disposition\",\"attachment; filename=xxx\")\n    tarStream.pipe(res)\n  }<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u54cd\u5e94\u62e6\u622a\u5668<\/h2>\n\n\n\n<p>\u65b0\u5efa <code>common \/ response.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { CallHandler, Injectable, NestInterceptor } from \"@nestjs\/common\";\nimport { map } from \"rxjs\";\n\n@Injectable()\nexport class Response&lt;T&gt; implements NestInterceptor {\n  intercept(context,next:CallHandler){\n    return next.handle().pipe(map(data =&gt; ({ \n      data,\n      message:\"nibi\"\n    })));\n  }\n}<\/code><\/pre>\n\n\n\n<p>\u5728\u5168\u5c40\u6ce8\u5165 <code>main.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import {Response} from \".\/common\/response\"\n...\napp.useGlobalInterceptors(new Response())\n...<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5f02\u5e38\u62e6\u622a\u5668<\/h2>\n\n\n\n<p>\u65b0\u5efa <code>common \\ filter.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { ArgumentsHost, Catch, ExceptionFilter, HttpException } from \"@nestjs\/common\";\nimport {Request,Response} from \"express\"\n\n@Catch()\nexport class  HttpFilter implements ExceptionFilter {\n  catch(exception:HttpException,host:ArgumentsHost){\n    const ctx = host.switchToHttp()\n    const request = ctx.getRequest&lt;Request&gt;()\n    const response = ctx.getResponse&lt;Response&gt;()\n    response.status(500).json({\n      success:false,\n      time:new Date(),\n      data:exception.message,\n      path:request.url\n    })\n\n  }\n}<\/code><\/pre>\n\n\n\n<p>\u5168\u5c40\u6ce8\u518c\u62e6\u622a\u5668<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { HttpFilter } from '.\/common\/filter';\n...\napp.useGlobalFilters(new HttpFilter())\n...<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u7ba1\u9053<\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">\u5b88\u536b<\/h2>\n\n\n\n<p>\u5728\u4e2d\u95f4\u4ef6\u4e4b\u540e,\u7ba1\u9053\u548c\u62e6\u622a\u5668\u4e4b\u524d\u6267\u884c<\/p>\n\n\n\n<p>\u521b\u5efa\u547d\u4ee4<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>nest g gu role<\/code><\/pre>\n\n\n\n<p>\u5728\u8def\u7531\u4e2d\u4f7f\u7528 <code>xxx.controller.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import {RoleGuard} from \"..\/role\/role.guard\"\n\n@Controller('guard')\n@UseGuards(RoleGuard)\nexport class GuardController{...}<\/code><\/pre>\n\n\n\n<p>\u5168\u5c40\u6ce8\u518c\u5b88\u536b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import {RoleGuard} from \".\/role\/role.guard\"\n...\napp.useGlobalGuards(new RoleGuard())\n...<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Swagger<\/h2>\n\n\n\n<p>\u5b89\u88c5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn add @nestjs\/swagger  swagger-ui-express<\/code><\/pre>\n\n\n\n<p>\u5728 <code>main.ts<\/code> \u914d\u7f6e\u6807\u9898\u7b49\u76f8\u5173\u64cd\u4f5c<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>async function bootstrap(){\n    ...\n  const options = new DocumentBuilder().addBearerAuth().setTitle(\"\u6807\u9898\").setDescription(\"\u63cf\u8ff0\").setVersion(\"1\").build()\n  const document = SwaggerModule.createDocument(app,options)\n  SwaggerModule.setup(\"\/api-docs\",app,document)\n    ...\n    await app.listen(3000);\n}<\/code><\/pre>\n\n\n\n<p>\u5728\u8def\u7531\u5c42\u5206\u7ec4,\u8bbe\u7f6e\u6bcf\u4e2a\u63a5\u53e3 <code>xxx.controller.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/*\u8def\u7531\u5c42*\/\n@ApiTags(\"\u63a5\u53e3\u5206\u7ec4\u6807\u9898\")\n@ApiBearerAuth() \/*\u662f\u5426\u643a\u5e26token*\/\n\/*\u63a5\u53e3\u5c42\u914d\u7f6e*\/\n@ApiOperation({summary:\"get\u63a5\u53e3\",description:'\u63a5\u53e3\u7684\u529f\u80fd\u63cf\u8ff0'})\n@ApiParam({name:\"id\",description:\"\u8981\u4f20\u9012\u53c2\u6570\u8868\u8ff0\",required:true})\n@ApiQuery({name:\"page\",description:\"\u8981\u4f20\u9012\u7684\u53c2\u6570\u8868\u8ff0\"})\n@ApiResponse({status:403,description:\"\u8fd4\u56de\u793a\u4f8b\"})\n\/*Post\u8bf7\u6c42\u9700\u8981\u518d dto \u6587\u4ef6\u4e2d\u914d\u7f6e*\/\nimport { ApiProperty } from \"@nestjs\/swagger\";\nexport class XxxDto {\n  @ApiProperty({example:'xxx'}) \/*\u9ed8\u8ba4\u503c*\/\n  name:string; \/*\u53c2\u6570:\u7c7b\u578b*\/\n\n  @ApiProperty({example:0})\n  age:number\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u8fde\u63a5\u6570\u636e\u5e93<\/h2>\n\n\n\n<p>\u5b89\u88c5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn add typeorm mysql2 @nestjs\/typeorm<\/code><\/pre>\n\n\n\n<p>\u5728 <code>app.module.ts<\/code> \u4e2d\u914d\u7f6e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Module({\n    ...\n    imports:&#91;\n        TypeOrmModule.forRoot({\n          type: \"mysql\", \/\/\u6570\u636e\u5e93\u7c7b\u578b\n          username: \"root\", \/\/\u8d26\u53f7\n          password: \"\", \/\/\u5bc6\u7801\n          host: \"localhost\", \/\/host\n          port: 3306, \/\/\n          database: \"nestDB\", \/\/\u5e93\u540d\n          \/\/entities: &#91;__dirname + '\/**\/*.entity{.ts,.js}'], \/\/\u5b9e\u4f53\u6587\u4ef6\n          synchronize:true, \/\/synchronize\u5b57\u6bb5\u4ee3\u8868\u662f\u5426\u81ea\u52a8\u5c06\u5b9e\u4f53\u7c7b\u540c\u6b65\u5230\u6570\u636e\u5e93(\u751f\u4ea7\u73af\u5883\u5173\u95ed)\n          retryDelay:500, \/\/\u91cd\u8bd5\u8fde\u63a5\u6570\u636e\u5e93\u95f4\u9694\n          retryAttempts:10,\/\/\u91cd\u8bd5\u8fde\u63a5\u6570\u636e\u5e93\u7684\u6b21\u6570\n          autoLoadEntities:true, \/\/\u5982\u679c\u4e3atrue,\u5c06\u81ea\u52a8\u52a0\u8f7d\u5b9e\u4f53 forFeature()\u65b9\u6cd5\u6ce8\u518c\u7684\u6bcf\u4e2a\u5b9e\u4f53\u90fd\u5c06\u81ea\u52a8\u6dfb\u52a0\u5230\u914d\u7f6e\u5bf9\u8c61\u7684\u5b9e\u4f53\u6570\u7ec4\u4e2d\n        }),\n        ...\n    ],\n    ...  \n})<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u521b\u5efa\u8868\u5b9e\u4f53<\/h3>\n\n\n\n<p>\u5728 entity \u6587\u4ef6\u4e2d\u521b\u5efa\u5b9e\u4f53<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from \"typeorm\";\n@Entity()\nexport class User{ ... }<\/code><\/pre>\n\n\n\n<p>\u5728 mudule \u4e2d\u521b\u5efa\u5173\u8054<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Module({\n  imports:&#91;TypeOrmModule.forFeature(&#91;User])],\n  ...\n})<\/code><\/pre>\n\n\n\n<p>\u81ea\u589e\u7684\u4e3b\u952e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@PrimaryGeneratedColumn()\nid:number<\/code><\/pre>\n\n\n\n<p>\u81ea\u589euuid<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@PrimaryGeneratedColumn(\"uuid\")\nid:number<\/code><\/pre>\n\n\n\n<p>\u5217\u7c7b\u578b<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Column({type:\"varchar\",length:200}) \/*\u53ef\u4ee5\u8c03\u6574\u6570\u636e\u5e93\u6570\u636e\u7c7b\u578b*\/\n    password: string\n\n@Column({ type: \"int\"})\n    age: number\n\n@CreateDateColumn({type:\"timestamp\"}) \/*\u81ea\u52a8\u5b58\u4e2a\u65f6\u95f4\u6233*\/\n    create_time:Date<\/code><\/pre>\n\n\n\n<p>\u81ea\u52a8\u751f\u6210\u4e00\u5217<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Generated('uuid')\nuuid:string<\/code><\/pre>\n\n\n\n<p>\u5217\u9009\u9879<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Column({\n        type:\"varchar\",\n        name:\"ipaaa\", \/\/\u6570\u636e\u5e93\u8868\u4e2d\u7684\u5217\u540d\n        nullable:true, \/\/\u5728\u6570\u636e\u5e93\u4e2d\u4f7f\u5217NULL\u6216NOT NULL\u3002 \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u5217\u662fnullable\uff1afalse\n        comment:\"\u6ce8\u91ca\",\n        select:true,  \/\/\u5b9a\u4e49\u5728\u8fdb\u884c\u67e5\u8be2\u65f6\u662f\u5426\u9ed8\u8ba4\u9690\u85cf\u6b64\u5217\u3002 \u8bbe\u7f6e\u4e3afalse\u65f6\uff0c\u5217\u6570\u636e\u4e0d\u4f1a\u663e\u793a\u6807\u51c6\u67e5\u8be2\u3002 \u9ed8\u8ba4\u60c5\u51b5\u4e0b\uff0c\u5217\u662fselect\uff1atrue\n        default:\"xxxx\", \/\/\u52a0\u6570\u636e\u5e93\u7ea7\u5217\u7684DEFAULT\u503c\n        primary:false, \/\/\u5c06\u5217\u6807\u8bb0\u4e3a\u4e3b\u8981\u5217\u3002 \u4f7f\u7528\u65b9\u5f0f\u548c@ PrimaryColumn\u76f8\u540c\u3002\n        update:true, \/\/\u6307\u793a\"save\"\u64cd\u4f5c\u662f\u5426\u66f4\u65b0\u5217\u503c\u3002\u5982\u679c\u4e3afalse\uff0c\u5219\u53ea\u80fd\u5728\u7b2c\u4e00\u6b21\u63d2\u5165\u5bf9\u8c61\u65f6\u7f16\u5199\u8be5\u503c\u3002 \u9ed8\u8ba4\u503c\u4e3a\"true\"\n        collation:\"\", \/\/\u5b9a\u4e49\u5217\u6392\u5e8f\u89c4\u5219\u3002\n    })\n    ip:string<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">typeorm\u5bf9\u6570\u636e\u5e93\u7684\u589e\u5220\u6539\u67e5<\/h3>\n\n\n\n<p><code>*.service .ts<\/code> \u5c42\u7528\u4e8e\u4e1a\u52a1\u5904\u7406<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { Injectable } from '@nestjs\/common';\nimport { CreateUserDto } from '.\/dto\/create-user.dto';\nimport { UpdateUserDto } from '.\/dto\/update-user.dto';\nimport { InjectRepository } from '@nestjs\/typeorm';\nimport { User } from '.\/entities\/user.entity'; \/*\u9700\u8981\u5f15\u5165\u5b9a\u4e49\u597d\u7684 entity*\/\nimport { Repository,Like  } from 'typeorm';\n@Injectable()\nexport class UserService{\n    constructor(@InjectRepository(User) private readonly user:Repository&lt;User&gt;){}\n\n    \u521b\u5efa(){\n        const data = new User()\n        data.name = \"\u5f20\u4e09\"\n        data.doc = \"\u6cd5\u5916\u72c2\u5f92\"\n        const result = this.user.save(data)\n        return result\n    }\n\n    async \u67e5\u5168\u90e8(){\n        const data =  await this.user.find({\n          where:{\n            name:Like('%')\n          }\n        })\n        return data;\n    }\n\n    async \u67e5\u4e00\u6761(){\n        \/*\u67e5\u8be2 user \u8868\u4e2d id \u5b57\u6bb5\u7b49\u4e8e 1 \u7684\u6570\u636e*\/\n        const data = await this.user.finOne({where:{id:1}})\n    }\n\n    async \u6761\u4ef6\u67e5(){\n        const data =  await this.user.find({\n          where:{\n            name:Like(`%${name}%`)\n          }\n        })\n        return data\n    }\n\n    async \u6539(){\n        const result = await this.user.update(1, {name:'\u8d75\u56db',doc:\"\u8c61\u7259\u5c71\u4e8c\u4ed8\"});\n        return {\n          code:101,\n          data:result,\n          message:\"\u4fee\u6539\u6210\u529f\"\n        }\n    }\n\n    async \u5220\u9664(){\n        const result = await this.user.delete(id);\n        console.log(result)\n        return {\n          code:101,\n          data:result,\n          message:\"\u5220\u9664\u6210\u529f\"\n        }\n    }\n\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u5206\u9875\u67e5\u8be2<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@Injectable()\nexport class UserService{\n    constructor(@InjectRepository(User) private readonly user:Repository&lt;User&gt;){}\n    async findAll(query:{page:number,pageSize:number}) {\n        console.log((query.page-1)*query.pageSize)\n        const data =  await this.user.find({\n          where:{\n            name:Like('%')\n          },\n          \/**\u6839\u636eid\u5b57\u6bb5\u8fdb\u884c\u6392\u5e8f DESC\u5012\u5e8f ASC\u6b63\u5e8f*\/\n          order:{\n              id:\"DESC\"\n          }  \n          \/**\u5206\u9875\u914d\u7f6e skip \u504f\u79fb\u91cf\uff1btake \u8981\u663e\u793a\u7684\u4e2a\u6570*\/\n          skip:(query.page-1)*query.pageSize,\n          take:query.pageSize \n        })\n        \/**\u83b7\u53d6\u603b\u6570 *\/\n        const total = await this.user.count({\n          where:{\n            name:Like(\"%\")\n          }\n        })\n        return {\n          code:101,\n          data:{data:data,total:total},\n          message:\"\u8bf7\u6c42\u6210\u529f\"\n        };\n    }\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\u591a\u8868\u5173\u8054\u53ca\u8054\u67e5<\/h3>\n\n\n\n<p>\u793a\u4f8b user\u8868 \u548c tags\u8868 \u76f8\u4e92\u5173\u8054<\/p>\n\n\n\n<p><code>user.entity.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { Tags } from \".\/tags.entity\";\n@Entity()\nexport class User {\n  ...\n  \/*\u548c tags \u8868\u5efa\u7acb\u4e00\u5bf9\u591a\u5173\u7cfb\uff0c\u7b2c\u4e00\u4e2a\u53c2\u6570\u8868\u793a\u5173\u8054\u7684\u5b9e\u4f53\u7c7b\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570\u6307\u5b9a\u5173\u8054\u5b9e\u4f53\u4e2d\u7684\u53cd\u5411\u5173\u7cfb\u5b57\u6bb5*\/\n  @OneToMany(()=&gt;Tags,(tags)=&gt;tags.user )\n  tags:Tags&#91;]\n\n}<\/code><\/pre>\n\n\n\n<p><code>rags.entity.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { Column, CreateDateColumn, Entity, Generated, ManyToOne, PrimaryGeneratedColumn } from \"typeorm\";\nimport { User } from \".\/user.entity\";\n\n@Entity()\nexport class Tags{\n  ...\n  \/*\u8868\u793a\u548cUser\u5b9e\u4f53\u4e4b\u524d\u5b58\u5728\u591a\u5bf9\u4e00\u7684\u5173\u7cfb*\/\n  @ManyToOne(()=&gt;User)\n  user:User\n}<\/code><\/pre>\n\n\n\n<p>\u591a\u8868\u8054\u67e5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const data = await this.user.find({\n    relatons:&#91;'tags'],\n    ...\n})<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e8b\u52a1<\/h3>\n\n\n\n<p>\u5b9a\u4e49: \u4f5c\u4e3a\u4e00\u4e2a\u5355\u72ec\u903b\u8f91\u5de5\u4f5c\u5355\u5143\u6267\u884c\u7684\u4e00\u7cfb\u5217\u64cd\u4f5c\uff0c\u8fd9\u4e9b\u64cd\u4f5c\u8981\u4e48\u5168\u90e8\u6267\u884c\u6210\u529f\uff0c\u8981\u4e48\u5168\u90e8\u5931\u8d25\u56de\u6eda\u3002\u4e8b\u52a1\u7684\u76ee\u7684\u662f\u786e\u4fdd\u6570\u636e\u5e93\u7684\u4e00\u81f4\u6027\u548c\u5b8c\u6574\u6027<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u539f\u5b50\u6027\uff1a\u4e8b\u52a1\u4e2d\u7684\u64cd\u4f5c\u8981\u4e48\u5168\u90e8\u6210\u529f\uff0c\u8981\u4e48\u5168\u90e8\u5931\u8d25\u56de\u6eda\uff0c\u4e0d\u4f1a\u51fa\u73b0\u90e8\u5206\u64cd\u4f5c\u5931\u8d25\u548c\u6210\u529f\u7684\u60c5\u51b5<\/li>\n\n\n\n<li>\u4e00\u81f4\u6027\uff1a\u4e8b\u52a1\u6267\u884c\u524d\u540e\uff0c\u6570\u636e\u5e93\u7684\u72b6\u6001\u4fdd\u6301\u4e00\u81f4\u3002\u5982\u679c\u4e8b\u52a1\u6267\u884c\u6210\u529f\uff0c\u6570\u636e\u5e93\u7684\u72b6\u6001\u4f1a\u4ece\u4e00\u4e2a\u4e00\u81f4\u7684\u60c5\u51b5\u8f6c\u6362\u53e6\u4e00\u4e2a\u4e00\u81f4\u7684\u72b6\u6001<\/li>\n\n\n\n<li>\u9694\u79bb\u6027\uff1a\u4e8b\u52a1\u7684\u6267\u884c\u662f\u76f8\u4e92\u9694\u79bb\u7684\uff0c\u6bcf\u4e2a\u4e8b\u52a1\u7684\u64cd\u4f5c\u5bf9\u5176\u4ed6\u4e8b\u52a1\u662f\u4e0d\u53ef\u89c1\u7684\uff0c\u4e8b\u52a1\u4e4b\u95f4\u7684\u64cd\u4f5c\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u4e0d\u4f1a\u76f8\u4e92\u5e72\u6270<\/li>\n\n\n\n<li>\u6301\u4e45\u6027\uff1a\u4e00\u65e6\u4e8b\u52a1\u6210\u529f\u63d0\u4ea4\uff0c\u5176\u4ed6\u6570\u636e\u5e93\u7684\u4fee\u6539\u5c06\u6c38\u4e45\u4fdd\u5b58\uff0c\u5373\u5c06\u53d1\u751f\u7cfb\u7edf\u6545\u969c\u6216\u65ad\u7535\u7b49\u60c5\u51b5\uff0c\u6570\u636e\u5e93\u4e5f\u80fd\u6062\u590d\u5230\u4e8b\u52a1\u63d0\u4ea4\u7684\u72b6\u6001<\/li>\n<\/ul>\n\n\n\n<p>\u8bed\u6cd5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>this.moeny.manage.tarnsaction(async manage=&gt;{\n    manage.save(moeny,{id:1,money:100})\n})<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u914d\u7f6e\u73af\u5883\u53d8\u91cf<\/h2>\n\n\n\n<p>\u5b89\u88c5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn add @nestjs\/config  --save<\/code><\/pre>\n\n\n\n<p>\u5728\u6839\u76ee\u5f55\u521b\u5efa <code>.env<\/code> \u6587\u4ef6,\u8bbe\u7f6e\u73af\u5883\u53d8\u91cf<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DB = Mysql\nDB_HOOST = localhost\nDB_PROT = 3306\nDB_NAME = test\nDB_USER = root<\/code><\/pre>\n\n\n\n<p>\u5728 <code>app.module.ts<\/code> \u6587\u4ef6.\u5168\u5c40\u5bfc\u5165<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import {ConfigModule} from \"@nestjs\/config\";\n@Module({\n  imports: &#91;\n    ConfigModule.forRoot({\n      isGlobal:true\n    }),\n    ...\n  ],\n  controllers: &#91;],\n  providers: &#91;],\n})<\/code><\/pre>\n\n\n\n<p>\u5728\u5176\u4ed6\u6a21\u5757\u4e2d\u8c03\u7528\u73af\u5883\u53d8\u91cf<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import {ConfigService} from \"@nestjs\/config\"\nexport class TsetCOntroller{\n    @Get()\n    getUSer(){\n        console.log(this.configService.get(\"DB\"));\n        return ...\n    }\n}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Log\u65e5\u5fd7\u64cd\u4f5c<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u8bbe\u7f6e\u65e5\u5fd7\u7ea7\u522b<\/h3>\n\n\n\n<p>\u5728 <code>main.ts<\/code> \u4e2d\u914d\u7f6e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { NestFactory } from '@nestjs\/core';\nimport { AppModule } from '.\/app.module';\n\nasync function bootstrap() {\n  const app = await NestFactory.create(AppModule,{\n    \/**\u5173\u95ednest\u65e5\u5fd7 *\/\n    logger:false\n    \/**\u9009\u62e9\u65e5\u5fd7\u7ea7\u522b*\/\n    logger:&#91;\"log\",\"error\",\"warn\"]\n  });\n  await app.listen(3000);\n}\nbootstrap();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u5728\u63a7\u5236\u5668\u4e2d\u6253\u5370log<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@Controller()\nexport class UserController{\n    private logger = new Logger(UserController.name)\n    constructor(){}\n\n    @Get()\n    getUser():any{\n        this.logger.log(\"\u8bf7\u6c42\u6210\u529f\");\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4f7f\u7528\u7b2c\u4e09\u65b9\u65e5\u5fd7\u7ba1\u7406 pino<\/h3>\n\n\n\n<p>\u5b89\u88c5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn add pino-http pino-pretty  pino-roll<\/code><\/pre>\n\n\n\n<p>\u5728\u5168\u5c40\u914d\u7f6e\u65e5\u5fd7\u7cfb\u7edf <code>app.module.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Module({\n  imports: &#91;\n      ...\n    LoggerModule.forRoot({\n      pinoHttp:{\n        transport:{\n          targets:&#91;\n            {\n              level:\"info\",\n              target:\"pino-pretty\",\n              options:{\n                colorize:true,\n              },\n            },\n            {\n              level:\"info\",\n              target:\"pino-roll\",\n              options:{\n                file:join(\"logs\",\"log.txt\"),\n                frequency:\"daily\",\n                size:\"10m\",\n                mkdir:true\n              }\n            }\n          ]\n        }\n      }\n    })\n       ...\n  ],\n  controllers: &#91;],\n  providers: &#91;],\n})\nexport class AppModule {}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4f7f\u7528\u7b2c\u4e09\u65b9\u65e5\u5fd7\u7ba1\u7406 winston<\/h3>\n\n\n\n<p>\u5b89\u88c5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn add --save nest-winston winston winston-daily-rotate-file<\/code><\/pre>\n\n\n\n<p>\u914d\u7f6e<code>main.ts<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>async function bootstrap() {\n  \/*\u914d\u7f6ewinston\u76f8\u5173\u53c2\u6570*\/\n  const instance = createLogger({\n    transports:&#91;\n      new winston.transports.Console({\n        format:winston.format.combine(\n          winston.format.timestamp(),\n          winston.format.simple()\n        )\n      }),\n      new winston.transports.DailyRotateFile({\n        dirname:\"logs\",\n        level:\"warn\",\n        filename:\"application-%DATE%.log\",\n        datePattern:\"YYYY-MM-DD-HH\",\n        zippedArchive:true,\n        maxSize:\"20m\",\n        maxFiles:\"14d\",\n        format:winston.format.combine(\n          winston.format.timestamp(),\n          winston.format.simple()\n        )\n      })\n    ]\n  })\n\n  const app = await NestFactory.create(\n    AppModule,\n    {\n      logger:WinstonModule.createLogger({instance}) \/*\u5168\u5c40\u4f7f\u7528*\/\n    }\n  );\n  await app.listen(3000);\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">nest\u767b\u5f55\u9274\u6743\uff08JWT\uff09<\/h2>\n\n\n\n<p>\u5b89\u88c5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>yarn add @nestjs\/jwt @types\/passport-jwt @passport-jwt<\/code><\/pre>\n\n\n\n<p>\u5728 <code>app.module.ts<\/code> \u4e2d\u914d\u7f6e<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { JwtModule } from '@nestjs\/jwt';\r\n@Module({\r\n    imports:&#91;\r\n        ...\r\n        JwtModule.register({\r\n          secret:\"secret\", \/*\u79d8\u94a5*\/\r\n          signOptions:{expiresIn:\"1d\"} \/*\u8fc7\u671f\u65f6\u95f4*\/\r\n        })\r\n    ]\r\n})<\/code><\/pre>\n\n\n\n<p>\u5728 <code>controller<\/code> \u5c42\u4e2d\u521b\u5efa jwt<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { BadRequestException, Body, Controller, Get, Post, Req, Res, UnauthorizedException } from '@nestjs\/common';\r\nimport { JwtService } from '@nestjs\/jwt';\r\nimport {Response,Request} from \"express\"\r\n\r\n@Controller()\r\nexport class userController{\r\n    constructor(\r\n    \tprivate jwtService:JwtService\r\n    ) {}\r\n    \r\n    @Post(\"login\")\r\n    async login(@Body() Body){\r\n        \/*\u521b\u5efajwt*\/\r\n        const jwt = await this.jwtService.signAsync({id:Body.id})\r\n        return jwt\r\n    }\r\n    \r\n    @Get()\r\n    async user(@Req() require:Request){\r\n        \/*\u89e3\u6790jwt*\/\r\n        const data = await this.jwtService.verifyAsync(jwt)\r\n        return data\r\n    }\r\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5b89\u88c5\u811a\u624b\u67b6 \u9879\u76ee\u76ee\u5f55\u521b\u5efa \u5220\u9664 src \u4e2d\u591a\u4f59\u7684\u6587\u4ef6\u53ea\u4fdd\u7559 app.module.ts \u548c main.ts \u91cd [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[69],"tags":[],"class_list":["post-841","post","type-post","status-publish","format-standard","hentry","category-nest-js"],"_links":{"self":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/841","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=841"}],"version-history":[{"count":2,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/841\/revisions"}],"predecessor-version":[{"id":844,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/841\/revisions\/844"}],"wp:attachment":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}