我尝试使用功能:
exports.get = async function (req, res, next) {
filter.validateId(req,res,next);
const db = req.app.get('db');
let id = req.params.id;
let user;
try {
user = await db.models.user.findByPk(id);
} catch (err) {
res.send(400)
}
res.json(user);
};
和导出功能:
var validateId = function (req, res, next) {
let id = parseInt(req.params.id);
if (isNaN(id) || id <= 0) {
res.send(400);
}
res.locals.id = id;
return next();
};
exports.validateId=validateId;
但是我得到了错误:
GET / users / 203 404 17.862 ms-90
(节点:20775)UnhandledPromiseRejectionWarning:错误[ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头 在ServerResponse.setHeader(_http_outgoing.js:470:11) 在ServerResponse.header(/home/qt/dev/BigDealExpressJSTest/node_modules/express/lib/response.js:767:10) 在ServerResponse.send(/home/qt/dev/BigDealExpressJSTest/node_modules/express/lib/response.js:170:12) 在ServerResponse.json(/home/qt/dev/BigDealExpressJSTest/node_modules/express/lib/response.js:267:15) 在exports.get(/home/qt/dev/BigDealExpressJSTest/controllers/userController.js:28:7) (节点:20775)UnhandledPromiseRejectionWarning:未处理的承诺被拒绝。引发此错误的原因可能是抛出了一个没有catch块的异步函数,或者是拒绝了一个.catch()无法处理的承诺。 (拒绝ID:1) (节点:20775)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。
答案 0 :(得分:1)
这是错误的,原因有几个:
第一
if (isNaN(id) || id <= 0) {
res.send(400); //return res.send(400);
}
需要添加return
,以便即使在发送响应后next()
也不会被调用。
现在是出于真实原因:
在validateId
中,您正在传递get
函数的next
。因此,每当您从validateId
进行下一步调用时,您实际上是在next
中调用get
,从而将控件发送到下一个中间件。
因此,您需要从filter.validateId(req,res,next);
函数中删除get
行,并将其添加为第二个中间件。
即。
exports.get = async function (req, res, next) {
const db = req.app.get('db');
let id = req.params.id;
let user;
try {
user = await db.models.user.findByPk(id);
} catch (err) {
res.send(400)
}
res.json(user);
};
app.get('/route', validateId, get , (req,res)=>{.. do something })
或
app.get('/route', validateId, get)