简体   繁体   English

在快递上发送标题后无法设置标题

[英]Can't set headers after they are sent on express

I khow like a common question here on. 我在这里表达了一个常见的问题。 But I couldn't get a solution from everywhere. 但我无法从各地获得解决方案。 here is my code: if row is not empty then render code page, otherwise perform another action. 这是我的代码:如果row不为空,则渲染代码页,否则执行另一个操作。

app.get('/send',function(req,res){
  var code=req.query['c']; // -- get request from input
  connection.query("use mynum");
  var strQuery = "select * from table WHERE code='"+code+"' LIMIT 1";   
  connection.query( strQuery, function(err, rows){
    if(err) {
      throw err;
    }else{
      if(rows.length==1){
        res.render('pages/code', {code : rows[0].code});
        connection.end();
        res.end();
      }else {
        // here is some actions
      }
    }
  });
  res.end();
});

the stack trace: 堆栈跟踪:

Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:690:11)
at ServerResponse.header (C:\wamp\www\vin_number\node_modules\express\lib\re
sponse.js:666:10)
at ServerResponse.res.contentType.res.type (C:\wamp\www\vin_number\node_modu
les\express\lib\response.js:532:15)
at ServerResponse.send (C:\wamp\www\vin_number\node_modules\express\lib\resp
onse.js:121:14)
at fn (C:\wamp\www\vin_number\node_modules\express\lib\response.js:900:10)
at View.exports.renderFile [as engine] (C:\wamp\www\vin_number\node_modules\
ejs\lib\ejs.js:323:3)
at View.render (C:\wamp\www\vin_number\node_modules\express\lib\view.js:93:8
)
at EventEmitter.app.render (C:\wamp\www\vin_number\node_modules\express\lib\
application.js:530:10)
at ServerResponse.res.render (C:\wamp\www\vin_number\node_modules\express\li
b\response.js:904:7)
at Query._callback (C:\wamp\www\vin_number\server.js:102:6)

You're sending a response twice via res.end() . 您通过res.end()发送了两次响应。 Get rid of the second one and you should be fine. 摆脱第二个,你应该没事。 Also, calling res.end() after res.render() is redundant since res.render() automatically ends the response with the rendered result by default. 另外,主叫res.end()之后res.render()是多余的,因为res.render()自动结束与默认渲染结果的响应。

Just learned this! 刚学会了这个! pass your responses through a function that checks if the response was already sent: 通过检查响应是否已发送的函数传递您的回复:

app.use(function(req,res,next){
  var _send = res.send;
  var sent = false;
  res.send = function(data){
    if(sent) return;
    _send.bind(res)(data);
    sent = true;
};
  next();
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM