Я разрабатываю RESTful API с Node.js, Mongoose и Koa, и я немного застрял на том, что является лучшим опытом, когда речь идет о схемах и проверке ввода.
В настоящее время у меня есть обасхема Мангуста и Джоя для каждого ресурса.Схема 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 используется в промежуточном программном обеспечении для проверки ввода данных пользователем.У меня есть 3 разные схемы Joi для каждого ресурса, потому что разрешенный ввод варьируется в зависимости от метода запроса (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 наtop of Mongoose является оптимальной, учитывая, что Mongoose также имеет встроенную проверку.Если нет, то какие еще хорошие практики следует соблюдать?
Спасибо!