Express验证返回错误的响应错误代码

时间:2020-01-22 13:58:07

标签: javascript node.js express express-validator

我正在使用Express-validation验证请求字段。除了响应错误代码

我有以下代码:

//
// ValidationLeaner.js
const Joi = require('joi');

module.exports = {
  body: {
    name: Joi.string().min(3).max(20).required(),
    classifierId: Joi.number().integer().positive().required()
  }
}

//Route.js
const { Router } = require('express')
const Validate = require('express-validation')
const ValidationLearner = require('./ValidationLeaner')

const router = Router()

router.route('/').post(Validate(ValidationLearner), ...someFunction)

module.exports = router

在发送带有正文的POST请求时:{name: "Leaner01", classifierId: false}。 我收到以下正确的答复:

{
  "status": 400,
  "statusText": "Bad Request",
  "errors": [
     {
       "field": [ "classifierId" ],
       "location": "body",
       "messages": [ "\"classifierId\" must be a number" ],
       "types": [ "number.base" ]
      }
  ]
}

很遗憾,响应代码是 500 Internal Server Error (内部服务器错误),而不是响应正文中指出的 400

我们如何使Express-validation发送正文中所述的相同响应代码(状态:400)?

2 个答案:

答案 0 :(得分:1)

我相信更改此行

const {ValidationLearner} = require('./ ValidationLeaner')

进入

const ValidationLearner = require('./ ValidationLeaner')

将更改结果。因为在第一种情况下ValidationLearner是未定义的,因为ValidationLearner.js(是ValidationLeaner.js还是ValidationLearner.js)会导出具有名为body而不是ValidationLearner的第一级属性的对象。

答案 1 :(得分:1)

您的主文件(索引,app或server.js)中是否有错误句柄,因为在express-validation文档中是必需的。

您可以将此错误处理程序添加到主文件(索引,应用程序或server.js)中,然后再试一次吗?

const Validate = require("express-validation");

app.use(function(err, req, res, next) {
  // specific for validation errors
  if (err instanceof Validate.ValidationError)
    return res.status(err.status).json(err);

  // other type of errors, it *might* also be a Runtime Error
  return res.status(500).send(err.stack);
});