我正在使用Node.js、Mongoose和Koa开发RESTful API,目前在模式和输入验证方面遇到了一些困难。
目前我为每个资源都有一个Mongoose和Joi模式。Mongoose方案仅包括特定资源的基本信息。例如:
const UserSchema = new mongoose.Schema({
email: {
type: String,
lowercase: true,
},
firstName: String,
lastName: String,
phone: String,
city: String,
state: String,
country: String,
});
Joi模式包含有关对象的每个属性的详细信息:
{
email: Joi.string().email().required(),
firstName: Joi.string().min(2).max(50).required(),
lastName: Joi.string().min(2).max(50).required(),
phone: Joi.string().min(2).max(50).required(),
city: Joi.string().min(2).max(50).required(),
state: Joi.string().min(2).max(50).required(),
country: Joi.string().min(2).max(50).required(),
}
Mongoose模式用于在写入数据库时,在端点处理程序级别创建给定资源的新实例。
router.post('/', validate, routeHandler(async (ctx) => {
const userObj = new User(ctx.request.body);
const user = await userObj.save();
ctx.send(201, {
success: true,
user,
});
}));
Joi schema 用于在验证中间件中验证用户输入。我为每个资源编写了3个不同的 Joi schema,因为允许的输入根据请求方法(POST、PUT、PATCH)而变化。
async function validate(ctx, next) {
const user = ctx.request.body;
const { method } = ctx.request;
const schema = schemas[method];
const { error } = Joi.validate(user, schema);
if (error) {
ctx.send(400, {
success: false,
error: 'Bad request',
message: error.details[0].message,
});
} else {
await next();
}
}
我想知道在使用多个Joi模式之上的Mongoose是否是最佳实践,考虑到Mongoose已经具有内置验证功能。如果不是,那么有哪些好的实践方法可以遵循?
谢谢!