NodeJS - Supertest throw错误:我在使用app测试时发送标题后不能设置标题,例如supertest.agent(express())

时间:2016-12-08 08:42:44

标签: node.js express header mocha supertest

我使用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
        });
    }
});

2 个答案:

答案 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循环并执行中间件链中的下一个链接。