Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 验证时如何一次发送多个错误?_Javascript_Node.js_Rest_Express_Validation - Fatal编程技术网

Javascript 验证时如何一次发送多个错误?

Javascript 验证时如何一次发送多个错误?,javascript,node.js,rest,express,validation,Javascript,Node.js,Rest,Express,Validation,当我为创建POST请求时,我需要验证以下字段:名字、姓氏、手机号码、预订日期、预订时间和人员(聚会规模) 现在我有一个中间件功能,可以检查是否缺少任何字段: function hasProperties(...properties) { return function (res, req, next) { const { data = {} } = res.body; try { properties.forEach((property) => {

当我为创建POST请求时,我需要验证以下字段:名字、姓氏、手机号码、预订日期、预订时间和人员(聚会规模)

现在我有一个中间件功能,可以检查是否缺少任何字段:

function hasProperties(...properties) {
  return function (res, req, next) {
    const { data = {} } = res.body;

    try {
      properties.forEach((property) => {
        if (!data[property]) {
          const error = new Error(`${property}`);
          error.status = 400;
          throw error;
        }
      });
      next();
    } catch (error) {
      next(error);
    }
  };
}
然后在我的控制器中:

const hasAllProps = hasProperties(
  'first_name',
  'last_name',
  'mobile_number',
  'reservation_date',
  'reservation_time',
  'people'
);
这是伟大的工作,但我必须添加额外的验证几个领域。我有两个附加功能:一个是确保人员字段是一个数字,另一个是确保预订日期是一个日期:

const validPeople = (req, res, next) => {
  const { people } = req.body;
  if (Number.isInteger(people)) {
    return next();
  }
  next({ status: 400, message: 'people' });
};

const validDate = (req, res, next) => {
  const { reservation_date } = req.body;
  if (reservation_date instanceof Date) {
    return next();
  }
  next({ status: 400, message: 'reservation_date' });
};
然后我将它们全部传递到我的导出:

create: [hasAllProps, validDate, validPeople]
我一次只能发送一个错误,在本例中是validDate,因为它在导出数组中位于validPeople之前。我无法将所有错误都放入数组中,因为我需要使用以下命令进行响应:

status: 400, message: '<the-specific-field>'
状态:400,消息:“”

有没有一种方法可以单独发送所有这些错误消息?

使用HTTP/S,您不能有一个请求和两个响应。客户端系统发送请求,接收响应,并且不期望第二个响应。

正如另一个响应所述,如果您尝试发送多个响应,则不可能。然而,您可以构造一个错误数组

从技术上讲,您可以在中间件之间传递数据。。。()

。。。但我的建议是尝试将它们合并到一个中间件中。例如,
hasAllProps
validPeople
validDate
理想情况下都应该接收
req
并返回
null
或错误。然后你可以做:

函数有效期(req){
返回null;
}
函数validOtherProp(req){
返回“error_here”;
}
功能验证(req){
返回“第二个_错误”;
}
常量ErrorCollectorMiddle=(…验证程序)=>
(请求、恢复、下一步)=>{
const errors=validators.map(v=>v(req)).filter(error=>error!==null);
如果(errors.length>0){
下一个({
现状:400,
错误
})
}否则{
next();
}
}
//这就是构建中间件的方式
const middleware=errorCollectorMiddleware(validDate、validOtherProp、其他验证);
//这是一个测试。在实际代码中不会这样做。
log(中间件(null,null,console.log))
/*
{
“状态”:400,
“错误”:[
“此处出现错误”,
“第二个错误”
]
}
*/