我使用supertest来测试我的RESTful API,它是通过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
});
}
});
答案 0 :(得分:0)
您无法多次发送回复。
在res.json(paramObj[param]);
循环内部for
每次迭代都会发送一个响应。
您需要发送一次 响应。
答案 1 :(得分:0)
我同意@Swaraj。
将return
循环中的for
改为break
。
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]);
break;
}
}
next();
这将突破for
循环并执行中间件链中的下一个链接。