第三方的有点搞不懂怎么写的,所以需要手搓一个来尝试一下
场景说明:
像是下面这个中间件:
/**
* 对用户头像更改接口body中携带的必要参数进行校验
* @param ctx
* @param next
* @returns {Promise<void>}
*/
avatarUploadParams: async (ctx, next) => {
const verifyRes = verify(ctx, {
require: [{
key: "friendId",
type: String
}]
}, true);
if (verifyRes.length >= 0) {
userParamsError.result = verifyRes;
ctx.body = userParamsError;
return false;
} else {
await next();
}
}
你这里的中间件可能会有多个,那么你可以在第一个中间件的文件入口处进行参数校验:
example:
/**
*
* @param ctx
* @param verifyObj{Object | Array} 需要校验的关键字
* @param needToken{Boolean} 是否需要token
* @returns {boolean|*[]}
*/
const verify = (ctx, verifyObj, needToken) => {
const requireList = verifyObj.require;
const result = [];
if (requireList) {
requireList.forEach(item => {
// item 为string
if (item.constructor === String) {
if (!ctx.request.body[item]) {
result.push(`缺少${item}参数`);
}
} else if (item.constructor === Object) {
if (!ctx.request.body[item.key]) {
result.push(`缺少${item.key}参数`);
} else {
try {
if (((ctx.request.body)[item.key]).constructor !== item.type) {
result.push(`${item.key}的类型错误`);
}
} catch (e) {
console.log(e);
}
}
}
});
}
let token = "";
if (needToken) {
token = ctx.request.headers?.token || ctx.request.headers?.authorization || ctx.request.body?.token;
if (token) {
// 挂载,方便后续取值
ctx.request.body.token = token;
let user = {};
try {
user = jwt.verify(token, salt);
ctx.request.body.user = user;
} catch (e) {
// 可能是token过期
console.log("可能是token过期");
ctx.body = TokenExpiredError;
}
} else {
result.push("token不存在");
return result;
}
}
return result.length === 0 ? true : result;
};
上面这里是目前改进的代码