Я использую supertest для тестирования моего RESTful API, который развивается экспресс, но я столкнулись с проблемой. Следующее сообщение отладки.NodeJS - Supertest throw Ошибка: не удается установить заголовки после их отправки, когда я использую приложение для тестирования, например, supertest.agent (express())
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)
at ServerResponse.header \nodejs-framework\node_modules\express\lib\response.js:719:10)
at ServerResponse.send \nodejs-framework\node_modules\express\lib\response.js:164:12)
at done \nodejs-framework\node_modules\express\lib\response.js:956:10)
at View.exports.renderFile [as engine] \nodejs-framework\node_modules\ejs\lib\ejs.js:355:10)
at View.render \nodejs-framework\node_modules\express\lib\view.js:126:8)
at tryRender \nodejs-framework\node_modules\express\lib\application.js:639:10)
at EventEmitter.render \nodejs-framework\node_modules\express\lib\application.js:591:3)
at ServerResponse.render \nodejs-framework\node_modules\express\lib\response.js:960:7)
at D:\H60\H60_New\nodejs-framework\app.js:216:13
at Layer.handle_error \nodejs-framework\node_modules\express\lib\router\layer.js:71:5)
at trim_prefix \nodejs-framework\node_modules\express\lib\router\index.js:310:13)
at D:\H60\H60_New\nodejs-framework\node_modules\express\lib\router\index.js:280:7
at Function.process_params \nodejs-framework\node_modules\express\lib\router\index.js:330:12)
at next \nodejs-framework\node_modules\express\lib\router\index.js:271:10)
at D:\H60\H60_New\nodejs-framework\node_modules\express\lib\router\index.js:618:15
at IncomingMessage.next \nodejs-framework\node_modules\express\lib\router\index.js:256:14)
at done \nodejs-framework\node_modules\express\lib\response.js:955:25)
at tryRender \nodejs-framework\node_modules\express\lib\application.js:641:5)
at EventEmitter.render \nodejs-framework\node_modules\express\lib\application.js:591:3)
Когда я использую supertest.agent (envFile.API_SERVER.url) в качестве тестовой мишени, она будет проходить вечно,
, но в то время как я использую supertest.agent (envFile.API_SERVER.app), который является введите точку в моем проекте, она будет провалена, когда мне нужно будет ответить в промежуточном программном обеспечении.
Следующее, это мой код в моем промежуточном программном обеспечении.
let paramObj = {
account: -1,
pw: -2,
email: -3,
},
paramObjKey = Object.keys(paramObj);
for (let param of paramObjKey) {
if (typeof req.body[param] === "undefined") {
res.json(paramObj[param]);
return;
}
}
next();
У меня есть другое промежуточное программное обеспечение, которое будет обрабатывать исключения, и это является основной причиной этой проблемы. Он снова ответит после ответа предыдущего промежуточного программного обеспечения.
app.use(function(err, req, res, next) {
if (!typeService.isNull(err)) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
}
});
Я думаю, что он будет возвращен, когда он найдет первый отсутствующий параметр. Я пробовал это в https://codepen.io/anon/pen/KNeJWj –