Ошибка: невозможно установить заголовки после их отправки после вызова res.render () - PullRequest
0 голосов
/ 22 октября 2018

Я получаю следующую ошибку:

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() IЯ получаю вышеуказанную ошибку.Я не знаю, как это исправить или что я делаю не так?

Я хочу показать данные гонщика в Google Maps, а возвращенные данные не отформатированы. Вот почему я должен использовать JSON.stringify(stringify).

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

В соответствии с реализацией метода рендеринга экспресса

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 ()
  • send ()
  • sendFile ()
  • sendStatus ()

Вы не можете объединить любой из этих методов в одной функции, поэтому удаление response.end() в вашем коде решит вашу проблему.

0 голосов
/ 22 октября 2018

НЕ используйте методы рендеринга и завершения.Если вы используете метод ответа дважды или более, Ошибка: невозможно установить заголовки после их отправки случается

Вам не нужен метод response.end в экспрессе.Удалите его, и тогда ваш код будет работать.

метод рендеринга уже включает конечную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...