UNPKG

mockm

Version:

Analog interface server, painless parallel development of front and back ends.

95 lines (78 loc) 3.12 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault"); var _assign = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/assign")); var _promise = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/promise")); var _some = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/some")); var _entries = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/entries")); /** 自动校验数据 - 在 side 中 - schema 对象中包含 header/path/query/cookie/body 这些 joi schema 对象, 本插件为自动校验它们 - validateAuto -- boolean, 是否自动验证, 默认 true - validateErrorNext -- boolean, 验证不通过时是否进入主业务, 默认 false - todo // todo - [ ] feat: 支持校验 config.db */ module.exports = { key: `validate`, summary: `自动校验数据`, hostVersion: [], async main({ hostInfo, pluginConfig, config, util }) { return { async apiListParsed(serverRouterList = []) { for (let index = 0; index < serverRouterList.length; index++) { const serverRouterItem = serverRouterList[index]; (0, _assign.default)(serverRouterItem, { validateAuto: true, // Boolean, 是否自动验证 validateErrorNext: false // Boolean, 验证不通过时是否进入主业务 }, serverRouterItem); if (util.toolObj.type.isEmpty(serverRouterItem.schema) === false) { const actionOld = serverRouterItem.action; serverRouterItem.action = async (req, res, next) => { req.schema = serverRouterItem.schema; if (serverRouterItem.validateAuto) { const error = await new _promise.default((resolve, reject) => { var _context; let error; (0, _some.default)(_context = (0, _entries.default)(req.schema)).call(_context, ([key, val]) => { const data = { header: req.headers, path: req.params, query: req.query, cookie: req.cookies, body: req.body }[key]; error = val.validate(data).error; if (error) { req.validateKey = key; req.validateError = error; } return error; }); resolve(error); }); if (error) { if (serverRouterItem.validateErrorNext) { await actionOld(req, res, next); } else { res.status(400).json(error.details); } } else { await actionOld(req, res, next); } } else { await actionOld(req, res, next); } }; } } } }; } };