【问题标题】:Error: Can't set headers after they are sent after res.render() call错误:在 res.render() 调用后发送标头后无法设置标头
【发布时间】:2019-03-26 03:50:13
【问题描述】:

我收到以下错误:

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at Array.write (D:\UberGo\node_modules\finalhandler\index.js:285:9)
    at listener (D:\UberGo\node_modules\on-finished\index.js:169:15)
    at onFinish (D:\UberGo\node_modules\on-finished\index.js:100:5)
    at callback (D:\UberGo\node_modules\ee-first\index.js:55:10)
    at IncomingMessage.onevent (D:\UberGo\node_modules\ee-first\index.js:93:5)
    at emitNone (events.js:106:13)
    at IncomingMessage.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickCallback (internal/process/next_tick.js:181:9)

我的控制器:

app.get('/rider/history', function(request, response,next) {
  rideHistory=[];
  rhController.getAllRides(request.session.riderId, function (err, result) {
    if (err) return handleError(err);
    if (result.length > 0) {                
      response.render('rider_history.html',{
        rideHistory: JSON.stringify(result),
        Title: config.title.history,
        moment: moment
      }); 
      response.end();
    }
  });

var Projection = {
    __v         : false,
    _id         : false, 
};
exports.getAllRides = function(riderId, callback){
    rideHistory.find({RiderId: riderId},Projection, callback);
};

当我渲染我的页面时,它工作正常,但在调用JSON.stringify() 后,我收到了上述错误。我不知道如何解决它或我做错了什么?

我想在 Google 地图中显示骑手数据,但返回的数据没有格式化。- 这就是我必须使用 JSON.stringify(stringify) 的原因。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    不要同时使用渲染和结束方法。如果您使用响应方法两次或更多次,Error: Can't set headers after they are sent会发生

    express 中不需要 response.end 方法。删除它,然后你的代码就可以工作了。

    渲染方法已经包含了结束特征。

    【讨论】:

      【解决方案2】:

      按照express的render方法实现

      res.render = function render(view, options, callback) {
          var app = this.req.app;
          var done = callback;
          var opts = options || {};
          var req = this.req;
          var self = this;
      
          // support callback function as second arg
          if (typeof options === 'function') {
              done = options;
              opts = {};
          }
      
          // merge res.locals
          opts._locals = self.locals;
      
          // default callback to respond
          done = done || function (err, str) {
              if (err) return req.next(err);
              self.send(str);  // < - THIS LINE IS SENDING RESPONSE
          };
      
          // render
          app.render(view, opts, done);
      };
      

      默认情况下它会发送响应,因此您只能对一个 HTTP 请求发送一个响应,因此在 express 中,您只能使用一种方法,而不是每个请求仅关注一次。

      • end()
      • json()
      • jsonp()
      • 渲染()
      • 发送()
      • sendFile()
      • sendStatus()

      您不能在一个函数中组合任何此方法,因此在您的代码中删除 response.end() 将解决您的问题。

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 1970-01-01
        • 2018-06-08
        • 2018-06-29
        • 2013-12-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多