当我为创建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((函数发送数据吗?(
但我的建议是尝试将它们合并到一个中间件中。例如,理想情况下,hasAllProps
、validPeople
和validDate
都应接收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,不能有一个请求和两个响应。客户端系统发送请求,接收响应,并且不期望第二个响应。