Koa 使用小技巧(小结)

2020-06-17 06:12:42易采站长站整理

return value;
});
return async (ctx, next) => {
const trackerInfo = {
url: ctx.url,
form: ctx.request.body,
};
try {
await next();
} catch (err) {
trackerInfo.error = err.message;
throw err;
} finally {
trackerInfo.params = ctx.params;
if (!trackerInfo.error) {
trackerInfo.body = ctx.body;
}
console.info(stringify(trackerInfo))
}
};
}

app.use(bodyParser());
app.use(tracker());

router.post('/users/v1/:type', async (ctx) => {
// ctx.throw(400, '密码出错');
await new Promise(resolve => setTimeout(resolve, 100))
ctx.body = {
account: 'vicanso',
};
});

使用此中间件之后,可以将所有接口的参数、正常响应数据或出错信息都全部输出至日志中,可根据需要调整 stringify 的实现,将一些隐私数据做***处理。需要注意的是,由于部分接口的body响应体部分较大,是否需要将所有数据都输出至日志最好根据实际情况衡量。如可根据HTTP Method过滤,或者根据url规则等。

参数校验

由于javascript的弱类型,接口参数校验一直是要求最严格的一点,而在了解过 joi 之后,我就一直使用它来做参数校验,如注册功能,账号、密码为必选参数,而邮箱为可选,接口校验的代码如下:


function validate(data, schema) {
const result = Joi.validate(data, schema);
if (result.error) {
// 出错可创建自定义的校验出错类型
throw result.error;
}
return result.value;
}

router.post('/users/v1/register', async (ctx) => {
const data = validate(ctx.request.body, Joi.object({
// 账号限制长度为3-20个字符串
account: Joi.string().min(3).max(20).required(),
// 密码限制长度为6-30,而且只允许字母与数字
password: Joi.string().regex(/^[a-zA-Z0-9]{6,30}$/).required(),
email: Joi.string().email().optional(),
}));
ctx.body = {
account: data.account,
};
});

通过joi简单快捷实现了参数的校验,不过在实际使用中,有部分的参数校验规则是通用的,如账号、密码这些的校验规则在注册和登录中都通过,但是有些接口是可选,有一些是必须,怎么才能更通用一些呢?代码调整如下:


const userSchema = {
// 账号限制长度为3-20个字符串
account: () => Joi.string().min(3).max(20),
// 密码限制长度为6-30,而且只允许字母与数字
password: () => Joi.string().regex(/^[a-zA-Z0-9]{6,30}$/),
email: () => Joi.string().email(),
}

router.post('/users/v1/register', async (ctx) => {
const data = validate(ctx.request.body, Joi.object({