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



当我为创建POST请求时,我需要验证以下字段:first_name、last_name、mobile_number、reservation_date、reservation _time和people(party size(。

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

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'
);

这是很好的工作,但我必须添加额外的验证到几个字段。我有两个额外的功能:一个是确保people字段是一个数字,另一个是确认reservation_date是一个日期:

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,因为它在exports数组中位于validPeople之前。我无法将所有错误放入数组,因为我需要用进行响应

status: 400, message: '<the-specific-field>'

有没有办法单独发送所有这些错误消息?

正如另一个响应所说,如果您试图发送多个响应,那是不可能的。不过,您可以构造一个错误数组。

从技术上讲,您可以在中间件之间传递数据。。。(我可以通过express next((函数发送数据吗?(

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

function validDate(req) {
return null;
}
function validOtherProp(req) {
return 'error_here';
}
function anotherValidation(req) {
return 'second_error';
}
const errorCollectorMiddleware = (...validators) =>
(req, res, next) => {
const errors = validators.map(v => v(req)).filter(error => error !== null);
if (errors.length > 0) {
next({
status: 400,
errors
})
} else {
next();
}
}
// This is how you construct a middleware
const middleware = errorCollectorMiddleware(validDate, validOtherProp, anotherValidation);
// And here's a test. You wouldn't do this in your actual code.
console.log(middleware(null, null, console.log))
/*
{
"status": 400,
"errors": [
"error_here",
"second_error"
]
}
*/

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

相关内容

  • 没有找到相关文章

最新更新