nestfy
TypeScript icon, indicating that this package has built-in type declarations

0.7.9 • Public • Published

Nestfy 框架

一个基于 Nestjs 的 Restful 后台框架。

本框架旨在帮助开发人员快速搭建一套成型的企业后台 REST 应用。
使用本框架之前需要先了解 Nestjs 框架


[TOC]

如何安装

npm: npm install --save nestfy

yarn: yarn add nestfy

使用方法

日志

本框架集成了 log4js 日志模块,开启日志功能需要在配置文件中开启日志功能,并进行配置。

如下给出几种工程中常用的配置:

日志只输出到 console 控制台

"logging"{
  "enable"true,
 
  // 日志配置,
  "configuration"{
    "appenders"{
      "console"{ "type""stdout" }
    },
    "categories"{
      "default"{ "appenders"["console"], "level""info" }
    }
  }
},

日志输出到控制台,并且还输出到 2 个文件,一个文件是记录所有日志,一个文件只记录错误日志

日志文件如果超过 maxLogSize 设置的容量,则会产生新文件

旧的日志文件会自动进行备份,备份文件会被压缩为 gz 格式

backups 设置保存日志文件的个数,多出的则被删除

"logging"{
  "enable"true,
 
  // 日志配置
  "configuration"{
    "appenders"{
      "txt"{
        "type""file",
        "filename""./logs/app.log",
        "maxLogSize"10485760,
        "backups"10,
        "compress"true
      },
      "err"{ "type""file", "filename""./logs/err.log", "maxLogSize"10485760, "backups"5, "compress"true },
      "out"{ "type""stdout" }
    },
    "categories"{
      "default"{ "appenders"["out", "txt"], "level""debug" },
      "error"{ "appenders"["err"], "level""error" }
    }
  }
}

日志输出到控制台和一个文件中 每天会产生一个新的日志文件,备份的旧文件会以日期命名

"logging"{
  "enable"true,
 
  // 日志配置,
  "configuration"{
    "appenders"{
      "txt"{ "type""dateFile", "filename""./logs/nestfy.log" },
      "out"{ "type""stdout" }
    },
    "categories"{
      "default"{ "appenders"["out", "txt"], "level""info" }
    }
  }
},

更详细的配置项,请参考 log4js 官方文档

跨域

允许所有请求 <推荐配置>

"cors"{
  "enable"true,
  "configuration"{}
}

只允许从 example.com 过来的请求

"cors"{
  "enable"true,
  "configuration"{
    "origin""http://example.com"
  }
}

更详细的配置参数,请参考 CORS 官网 https://github.com/expressjs/cors

参数校验

web 请求的参数可以自动被校验。 本框架可以从全局来进行控制,是否启用 DTO 参数校验的功能。

"validation"{
  "enable"true,
  "configuration"{
    "skipMissingProperties"true
  }
}

具体的配置参数,可以参考class-validator 官网

只有校验参数成功后,才进入 Controller 层;如果校验失败,则框架会抛出 Validation 异常,自动返回  错误的 JSON 结果给客户端。

示例如下:

query-photo.dto.ts

import { ApiModelProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import { IsDefined, IsInt, IsNotEmpty, IsNumberString, IsString } from 'class-validator';
 
export class QueryPhotosDto {
  @ApiModelProperty({ description: '查询偏移量', required: true })
  @IsDefined()
  @Type(() => Number)
  @IsInt()
  public offset: number;
 
  @ApiModelProperty({ description: '查询个数', required: true })
  @IsDefined()
  @Type(() => Number)
  @IsInt()
  public limit: number;
 
  @ApiModelProperty({ description: '名称', required: false })
  @IsString()
  @IsNotEmpty()
  public readonly name: string;
}

错误请求(不符合如上 DTO 要求的请求),被框架处理后的返回结果:

{
  "success": false,
  "status": 400,
  "timestamp": "2019-01-24T09:57:44.261Z",
  "message": "You have an error in your request's body. Check 'errors' field for more details!",
  "errors": [
    {
      "target": {},
      "property": "offset",
      "children": [],
      "constraints": {
        "isDefined": "offset should not be null or undefined"
      }
    },
    {
      "target": {},
      "property": "limit",
      "children": [],
      "constraints": {
        "isDefined": "limit should not be null or undefined"
      }
    }
  ],
  "path": "/api/rest/v1/photos"
}

自动记录 web 请求时间

项目开发的过程中,有时候需要在日志中打印出 web 请求到达的时间,后台处理消耗的时长,请求返回的时间等信息。 使用本框架,直接在nestfy.json配置文件中将如下开关开启即可。

"request"{
  // 是否自动记录每次请求的耗时时长(ms)
  "traceRequestDuration"true
}

auth 模块

该模块适用于基于 token 认证的后台项目,如果使用 session 机制,请关闭此开关。  开关开启后,会在全局范围内启用 token 认证,每一个 web 请求,都会去解析 header 中是否包含 token 信息,解析后的结果会存放在 express.Request 对象的由 decodedTag 指定的属性中。如下配置,就是存放在 req.user 中。

"auth"{
  "enable"false, // 是否启用,启用后请求如果不携带token信息,将无法调用所有接口
  "headerTag""x-access-token", // 放在header里面的tag的名称
  "secret""i6r5LgMJdoa5trlM", // 加密的密钥
  "expiresIn""24h", // 失效时长
  "decodedTag""user" // 解密后放在req对象里面的字段的名称
}

有些接口,在用户未登录的时候,也需要能够访问,这时候可以使用 @Auth 注解

放在函数前面,用于禁止该路由的 token 验证

  import { Auth } from 'nestfy';
  ...
  @Auth(false)
  @Get('/extends')
  public async extends(@Query() queryany)Promise<any> {
    return this._admAwardService.extends(query.date);
  }

swagger 支持

开启功能可以使用swagger自动产生API文档,可用配置如下,swagger的使用方法请看这里

"swagger"{
  "enable"true, // 是否启用swagger文档功能
  "title""nestfy-starter", // 文档的title
  "description""The photo API description", // 文档的描述
  "schemas""http", // 接口是否安全,仅支持(http 和 https两种)
  "version""1.0", // 文档的版本
  "email""qinyang_1980@qq.com", // 作者的联系email
  "path""/doc" // 文档路由
}

AppUtil

一个工具类,

请将名为 nestfy.json 的配置文件放在工程的根目录,模板如下:

!> 请带注释一起 copy,nestfy 可以识别 jsonc 格式的配置文件。

nestfy.json

{
  // 应用相关配置项
  "app"{
    // 服务的端口号
    "port"3000,
 
    // 服务启动成功后,打印此日志
    "setUpMsg""Nestfy server started",
 
    // 路由前缀
    "apiPrefix"{
      "enable"true, // 是否启用路由前缀
      "prefix""/api/rest" // 前缀
    }
  },
  // 日志相关配置项
  "logging"{
    // 是否启用日志
    "enable"true,
 
    // 日志配置,具体可以参考log4js的官方文档(https://log4js-node.github.io/log4js-node/)
    "configuration"{
      "appenders"{
        "txt"{ "type""dateFile", "filename""./logs/nestfy.log" },
        "out"{ "type""stdout" }
      },
      "categories"{
        "default"{ "appenders"["out", "txt"], "level""info" }
      }
    }
  },
  // web请求相关配置项
  "request"{
    // 是否自动记录每次请求的耗时时长(ms)
    "traceRequestDuration"true,
 
    // 跨域配置
    "cors"{
      // 是否启用跨域
      "enable"true,
 
      // 具体配置请参考Cors官方网站(https://github.com/expressjs/cors)
      "configuration"{}
    },
 
    // bodyParser第三方中间件配置
    "bodyParser"{
      // 是否启用bodyParser
      "enable"true,
 
      // Body的容量限制(mb)
      "limit""5mb"
    },
    // DTO类自动校验相关配置
    "validation"{
      "enable"true, // 是否启用自动校验功能
      "skipMissingProperties"true // 不存在的属性,是否跳过校验
    },
    // 接口权限控制相关配置
    "auth"{
      "enable"false, // 是否启用,启用后请求如果不携带token信息,将无法调用所有接口
      "headerTag""x-access-token", // 放在header里面的tag的名称
      "secret""i6r5LgMJdoa5trlM", // 加密的密钥
      "expiresIn""24h", // 失效时长
      "decodedTag""user" // 解密后放在req对象里面的字段的名称
    }
  },
  // web返回相关配置项
  "response"{
    // 成功情况配置
    "success"{
      // message字段的默认文本
      "defaultMessage""执行成功!",
 
      // success字段配置
      "successField"{
        "enable"true, // 是否启用success字段
        "name""success" // 字段的名字
      },
 
      // status字段配置
      "statusField"{
        "enable"true, // 是否启用status字段
        "name""status" // 字段的名字
      }
    },
    // 失败情况配置
    "failure"{
      // message字段的默认文本
      "defaultMessage""执行失败!",
 
      // success字段配置
      "successField"{
        "enable"true, // 是否启用success字段
        "name""success" // 字段的名字
      },
      // status字段配置
      "statusField"{
        "enable"true, // 是否启用status字段
        "name""status" // 字段的名字
      }
    }
  },
  // swagger相关配置
  "swagger"{
    "enable"true, // 是否启用swagger文档功能
    "title""nestfy-starter", // 文档的title
    "description""The photo API description", // 文档的描述
    "schemas""http", // 接口是否安全,仅支持(http 和 https两种)
    "version""1.0", // 文档的版本
    "email""qinyang_1980@qq.com", // 作者的联系email
    "path""/doc" // 文档路由
  }
}

然后在程序中导入 AppUtil 类,如下使用方式:

import { AppUtil } from 'nestfy';
import { ApplicationModule } from './modules/app.module';
 
AppUtil.bootstrap(ApplicationModule);

这样,一条语句即完成了应用类的创建,运行成功后,还会打印出  成功日志。

Readme

Keywords

none

Package Sidebar

Install

npm i nestfy

Weekly Downloads

0

Version

0.7.9

License

ISC

Unpacked Size

57.3 kB

Total Files

74

Last publish

Collaborators

  • qinyang_1980