mockm
Version:
Analog interface server, painless parallel development of front and back ends.
95 lines (78 loc) • 3.12 kB
JavaScript
;
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);
}
};
}
}
}
};
}
};