错误:res.render()调用后发送标头后无法设置

时间:2018-10-22 05:53:18

标签: node.js express

我遇到以下错误:

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 Maps中显示骑士数据,并且返回的数据未格式化。-这就是我必须使用JSON.stringify(stringify)的原因。

2 个答案:

答案 0 :(得分:3)

请勿同时使用render和end方法。如果您使用响应方法两次或更多次,则会发生错误:发送标头后无法设置标头

您不需要在express中使用response.end方法。删除它,然后您的代码即可使用。

渲染方法已经包含最终功能。

答案 1 :(得分:1)

根据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请求发送一个响应,因此,在表达方式上,每个请求只能跟踪一次,因此只能使用一种方法。

  • end()
  • json()
  • jsonp()
  • render()
  • 发送()
  • sendFile()
  • sendStatus()

您无法在一个函数中结合使用任何一种方法,因此在代码中删除response.end()将解决您的问题。