在 Mongoose 之上使用 Joi 进行验证是一个好的实践吗?

2024-01-17

我正在使用 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 模式用于验证中间件来验证用户输入。我为每个资源有 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();
  }
}

我想知道我目前在 Mongoose 之上使用多个 Joi 模式的方法是否是最佳的,考虑到 Mongoose 也有内置的验证。如果没有,可以遵循哪些良好做法?

Thanks!


即使您有猫鼬模式,实现验证服务也是一种常见的做法。正如您所说,在对数据执行任何登录之前,它会返回验证错误。所以,在这种情况下肯定会节省一些时间。 此外,您可以使用 joi 获得更好的验证控制。但是,这在很大程度上取决于您的要求,因为它会增加您必须编写的额外代码,这些代码可以避免,而不会对最终结果产生太大影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Mongoose 之上使用 Joi 进行验证是一个好的实践吗? 的相关文章

随机推荐