On this page
参数验证
插件地址:
安装
shell
npm i egg-valparams --save
配置
js
// config/plugin.js
valparams : {
enable : true,
package: 'egg-valparams'
},
// config/config.default.js
config.valparams = {
locale : 'zh-cn',
throwError: true
};
中间件:app/middleware/error_handler.js
js
module.exports = (option, app) => {
return async function errorHandler(ctx, next) {
try {
await next();
// 404 处理
if (ctx.status === 404 && !ctx.body) {
ctx.body = {
msg: "fail",
data: "404 错误",
};
}
} catch (err) {
// 记录一条错误日志
app.emit("error", err, ctx);
let status = err.status || 500;
// 生产环境时 500 错误的详细错误内容不返回给客户端,因为可能包含敏感信息
let error = status === 500 && app.config.env === "prod"
? "Internal Server Error"
: err.message;
// 从 error 对象上读出各个属性,设置到响应中
ctx.body = {
msg: "fail",
data: error,
};
// 参数验证异常
if (status === 422 && err.message === "Validation Failed") {
if (err.errors && Array.isArray(err.errors)) {
error = err.errors[0].err[0]
? err.errors[0].err[0]
: err.errors[0].err[1];
}
ctx.body = {
msg: "fail",
data: error,
};
}
ctx.status = status;
}
};
};
在控制器里使用
js
class XXXController extends app.Controller {
// ...
async XXX() {
const { ctx } = this;
ctx.validate({
system: {
type: "string",
required: false,
defValue: "account",
desc: "系统名称",
},
token: { type: "string", required: true, desc: "token 验证" },
redirect: { type: "string", required: false, desc: "登录跳转" },
});
// if (config.throwError === false)
if (ctx.paramErrors) {
// get error infos from `ctx.paramErrors`;
}
let params = ctx.params;
let { query, body } = ctx.request;
// ctx.params = validater.ret.params;
// ctx.request.query = validater.ret.query;
// ctx.request.body = validater.ret.body;
// ...
ctx.body = query;
}
// ...
}
ValParams API 说明
参数验证处理
Valparams.setParams(req, params, options);
👉 具体参数验证处理
js
const Valparams = require("path/to/Valparams[/index]");
Valparams.locale("zh-cn");
function list(req, res, next) {
let validater = Valparams.setParams(req, {
sysID: { alias: "sid", type: "int", required: true, desc: "所属系统id" },
page: {
type: "int",
required: false,
defValue: 1,
range: { min: 0 },
desc: "页码",
},
size: { type: "int", required: false, defValue: 30, desc: "页面大小" },
offset: { type: "int", required: false, defValue: 0, desc: "位移" },
}, {
choices: [{ fields: ["sysID", "page"], count: 1, force: false }],
});
if (validater.err && validater.err.length) {
console.log(validater.err);
} else {
console.log(validater);
//{ query: { page: 1, size: 30 },
// body: {},
// params: { sysID: 2 },
// all: { sysID: 2, page: 1, size: 30 },
// err: null }
// raw: { query: { page: 1, size: 30 },
// body: {},
// params: { sid: 2 },
// }
//}
//do something
}
}
返回支持的类型列表
js
Valparams.vType = {
ALL: "all",
STRING: "string",
ARRAY: "array",
DATE: "date",
INT: "int",
FLOAT: "float",
LETTER: "letter",
NUMBER: "number",
IP: "ip",
EMAIL: "email",
PHONE: "phone",
URL: "url",
JSON: "json",
BOOL: "bool",
NULL: "null",
RANGE: "range",
DATERANGE: "dateRange",
INTRANGE: "intRange",
FLOATRANGE: "floatRange",
NUMBERRANGE: "numberRange",
};
自定义本地化文件
Valparams.defineLocale(key, value);
Param | Type | Description | Example |
---|---|---|---|
key | String | 语言标识 | zh-cn |
value | Object | 本地化内容,可配置内容有 em_type, em_minmax, em_reg, em_in, em_schema, em_required, em_range_relation, em_choices, em_equals, em_compares, em_cases | --- |
更新已有本地化文件内容
Valparams.updateLocale(key, value);
参数含义同 defineLocale
获取本地化文件内容
Valparams.localeData(key);
Param | Type | Description | Example |
---|---|---|---|
key | String | 语言标识 | zh-cn |
列出已加载的本地化文件
Valparams.locales(key);
目前已有 en 、 zh-cn
Param | Type | Description | Example |
---|---|---|---|
key | String | 语言标识 | zh-cn |
设置使用的本地化文件
Valparams.locale(locale); 如: Valparams.locale('zh-cn')
;