Javascript 验证时如何一次发送多个错误?
当我为创建POST请求时,我需要验证以下字段:名字、姓氏、手机号码、预订日期、预订时间和人员(聚会规模) 现在我有一个中间件功能,可以检查是否缺少任何字段: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) => {
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,
“错误”:[
“此处出现错误”,
“第二个错误”
]
}
*/