2016-12-08 7 views
0

Я использую 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 
     }); 
    } 
}); 

ответ

0

Вы не можете отправлять ответы несколько раз.

res.json(paramObj[param]); внутри цикла for посылает ответ на каждую итерацию.

Необходимо отправить ответ только один раз.

+0

Я думаю, что он будет возвращен, когда он найдет первый отсутствующий параметр. Я пробовал это в https://codepen.io/anon/pen/KNeJWj –

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 и выполнить следующую ссылку в цепи промежуточного слоя.

 Смежные вопросы

  • Нет связанных вопросов^_^