私はNode.js、Mongoose、Koaを使ってRESTFUL APIを開発しています。
現在私は各リソースのMongooseとJoiスキーマの両方を持っています。 Mongoose Schemaには、特定のリソースに関する基本情報のみが含まれています。例:
const UserSchema = new mongoose.Schema({
email: {
type: String,
lowercase: true,
},
firstName: String,
lastName: String,
phone: String,
city: String,
state: String,
country: String,
});
_
Joi Schemaには、オブジェクトの各プロパティに関する詳細が含まれています。
{
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 Schemaは、データベースに書き込むときにエンドポイントハンドラレベルで与えられたリソースの新しいインスタンスを作成するために使用されます。
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スキーマは、検証ミドルウェアでユーザー入力を検証するために使用されます。許可された入力は要求方法(POST、PUT、PATCH)によって異なるため、リソースごとに3つの異なるJOIスキーマがあります。
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();
}
}
_
Mongooseの最適な複数のJoiスキーマを使用するという私の現在のアプローチが最適であるかどうか疑問に思っています。そうでなければ、従うべきいくつかの良い慣行は何でしょうか?
ありがとう!
セキュリティ上の検証を行うことは、サーバー側の検証を有効にすることができますが、サーバーサイドの検証を持つことは常に良い習慣です。
JOI was available for server-side validation but now it's deprecated so better to use express-validator.
_