NodeJS 我有一个Joi模式,我希望当我执行POST方法时,id被包括并且是必需的,而使用PUT方法时,id不被考虑在内

abithluo  于 2023-02-18  发布在  Node.js
关注(0)|答案(1)|浏览(136)

我有一个模式joi对象:

const commonFields = {
  id: joi.string().required(),
  name: joi.string().required().min(5).max(50),
  nif: joi.string().length(9).required(),
  diet: joi.bool().required().strict(),
  vegetarian: joi.bool().required().strict(),
};

const aluno = joi.object({
  ...commonFields,
  num: joi
    .string()
    .required()
    .regex(/^\d{1,4}\/\d{2}$/),
  regime: joi.string().required().valid("externo", "interno"),
});

(...)

当我发出PUT请求来更新用户时,我想忽略字段"id",但当我发出POST请求时,我想使它成为必需字段。
我尝试了以下方法:
在模式中,我向字段"id"添加了alter():

id: joi.string().alter({
    post: (schema) => schema.required(),
    put: (schema) => schema.forbidden(),
  }),

在我的职责中我这样做:

async function updateUser(req, res, type, db) {
  try {
    const { error } = requestValidation[type].validate(req.body, {
      context: { method: req.method }
    });
    
    if (error) {
      return res.status(400).send({ error: error.message });
    }

    const id = req.params.id;
    const { name, nif, vegetarian, diet } = req.body;
(..)

但是当我在PUT端点中调用这个函数来更新一个用户并将字段id添加到请求体中时,它并没有抛出一个应该抛出的错误。当我将id添加到请求体中时,响应应该是这样的:

{
    "error": "\"id\" is not allowed"
}

我想忽略id,因为我想通过req.params.id接收它。我可能不是最好的方法,但我愿意接受新的建议!

waxmsbnn

waxmsbnn1#

文档中有一个将tailor与alter配合使用的示例

const { error } = requestValidation[type].tailor(req.method.toLowerCase()).validate(req.body, {
  context: { method: req.method }
});

相关问题