# Node.js_Koa通用构架_restful_CMD_API接口服务 **Repository Path**: returnv/koa-restful-cmd-api ## Basic Information - **Project Name**: Node.js_Koa通用构架_restful_CMD_API接口服务 - **Description**: No description available - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-11-11 - **Last Updated**: 2022-01-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README > 使用此项目,请先新建并配置根目录下的`.env`文件 ```sh #服务启动端口号 APP_PORT=3000 #数据库连接参数 MYSQL_HOST=127.0.0.1 MYSQL_PORT=3306 MYSQL_USER=username MYSQL_PWD=password MYSQL_DB=database #jwt加密密钥 JWT_SECRET=WTF #上传文件的目录 UPLOAD_DIR=uploads #上传文件大小,默认5m MAX_UPLOAD_SIZE=1024*1024*5 ``` --- # 数据库连接 > 项目中使用`sequelize-cli`生成数据库和表 > > 使用项目中已经配置的数据库和表,运行命令`yarn newdb`,同时创建数据库和数据表 - 后期添加新的表,命令行运行命令: ```sh # 例子: --name User --attributes firstName:string,lastName:string,email:string ``` - 这会创建表模型和表迁移文件 - 然后对表迁移文件修改,生成符合项目要求的数据表 ```js 'use strict' module.exports = { up: async (queryInterface, Sequelize) => { await queryInterface.createTable('zd_users', { id: { allowNull: false, autoIncrement: true, primaryKey: true, type: Sequelize.INTEGER }, username: { type: Sequelize.DataTypes.STRING, allowNull: false, unique: true, comment: '用户名,唯一' }, password: { type: Sequelize.DataTypes.CHAR(64), allowNull: false, comment: '密码' }, phone: { type: Sequelize.DataTypes.CHAR(11), allowNull: false, comment: '注册手机号' }, is_admin: { type: Sequelize.DataTypes.BOOLEAN, allowNull: false, defaultValue: 0, comment: '是否为管理员,0:不是(默认);1:是' }, createdAt: { allowNull: false, type: Sequelize.DATE }, updatedAt: { allowNull: false, type: Sequelize.DATE } }) }, down: async (queryInterface, Sequelize) => { await queryInterface.dropTable('zd_users') } } ``` - 对表模型文件修改,以匹配项目代码中的引用 ```js 'use strict' const { Model, DataTypes: type } = require('sequelize') const seq = require('../seq') module.exports = (sequelize = seq, DataTypes = type) => { class zd_user extends Model { /** * Helper method for defining associations. * This method is not a part of Sequelize lifecycle. * The `models/index` file will call this method automatically. */ static associate(models) { // define association here } } zd_user.init( { username: { type: DataTypes.STRING, allowNull: false, unique: true, comment: '用户名,唯一' }, password: { type: DataTypes.CHAR(64), allowNull: false, comment: '密码' }, phone: { type: DataTypes.CHAR(11), allowNull: false, comment: '注册手机号' }, is_admin: { type: DataTypes.BOOLEAN, allowNull: false, defaultValue: 0, comment: '是否为管理员,0:不是(默认);1:是' } }, { sequelize, modelName: 'zd_user' } ) return zd_user } ``` - 代码中引入表模型 ```js const User = require('../db/models/zd_user')() ``` - 生成数据表,运行命令:`npx sequelize-cli db:migrate`,这会在数据库中生成数据表 --- # 配置网络请求测试 - 需要`VSCode`安装`REST Client`插件,在项目中的`request-test`目录中,创建请求的业务模块 - `REST Client`插件中配置全局环境变量,设置请求地址环境变量 **Example** ```sh # request-test/user.http @token={{login.response.body.result.token}} ### 用户登录 # @name login # host是全局请求地址变量,在settings.json中配置 POST {{host}}/user/login Content-Type: application/json { "username":"admin", "password":"admin" } ### 获取所有用户信息 GET {{host}}/user Authorization: Bearer {{token}} ### 注册用户 POST {{host}}/user/register Content-Type: application/json { "username":"admin", "password":"admin", "phone":"13303331233" } ### 修改密码 POST {{host}}/user/modify Content-Type: application/json Authorization: Bearer {{token}} { "username":"wp", "password":123 } ``` --- # 请求参数校验 - 中间件`auth.middleware.js`中创建的`verifyParameter`方法是校验请求参数的中间件方法 - 使用时,会自动在`src/verifyRules/`目录下寻找与路由地址匹配的方法 - 参数校验文件的规则: - 文件名称必须与请求路由中的控制器同名; - 在校验文件中,具体的校验规则对象名称,必须与请求路由中的 API 名称相同 **Example** ```js //路由文件 const { verifyParameter } = require('../middleware/auth.middleware') const router = new require('koa-router')({ prefix: '/goods' }) router.post('/add', verifyParameter, add) // 匹配路由:/goods/add //校验文件goods.verify.js const { invalidGoodsID } = require('../constant/err.type') module.exports = { add: { rule: { goods_name: { type: 'string', required: true }, goods_price: { type: 'number', required: true }, goods_num: { type: 'number', required: true }, goods_img: { type: 'string', required: true } }, errType: invalidGoodsID } } ``` --- # 上传文件分类 > 上传文件时,需要先在`.env`中配置上传的目录名称,当文件上传时,会自动上传至上传目录中的`temp`目录中,随后,会根据上传中间件中,配置上传文件的分类名称,将上传的文件移动至对应目录,并按日期归纳 - 在`src/utils/upload.utils.js`中,限制上传文件的大小,由`.env`中的`MAX_UPLOAD_SIZE`决定 - 需要按分类上传文件时,在中间件目录`src/middleware/upload.middleware.js`中,调用`resolveUploadFile`方法中传入上传文件分类的名称