ogregor
@ogregor
арендатор vpn сервера debian

В чем проблема в express framework Error: Can't set headers after they are sent?

Здравствуйте, вываливается ошибка при попытке формирования запроса к vk api и выдаче текстового файла на скачивание. Как видно рендерится файл прямо из функции получения данных, что конечно неправильно с точки зрения организации кода, но на тот момент только так придумал. Важная ремарка - ошибка возникает при повторному обращению по url

index.js

...
var vk = require('./lib/vk.js');

...

app.get('/vk', function(req, res) {

    if(req.query.action === 'getwall') {
      vk.getMessages('wall.get', {'owner_id' : req.query.id},res);
    } else {
        res.render('home', {view:'vk'});
    }
});

...
vk.js

exports.getMessages = function (req, params, res) {
    vk.setSecureRequests(true);
    vk.request(req, params);

    vk.on('done:wall.get', function (_o) {
        if(_o) {
        res.set({"Content-Disposition":"attachment; filename=\"backup.txt\""});
        res.send(JSON.stringify(_o, null, 4));
        //res.render('home', {vk: JSON.stringify(_o, null, 4)});
        }
    });
};

Вывод лога

5|index    | Error: Can't set headers after they are sent.
5|index    |     at ServerResponse.setHeader (_http_outgoing.js:358:11)
5|index    |     at ServerResponse.header (/../vk/node                                                                                            _modules/express/lib/response.js:719:10)
5|index    |     at ServerResponse.header (../vk/node                                                                                            _modules/express/lib/response.js:722:12)
5|index    |     at VK.<anonymous> (/.../vk/lib/vk.js:1                                                                                            5:6)
5|index    |     at emitOne (events.js:101:20)
5|index    |     at VK.emit (events.js:188:7)
5|index    |     at IncomingMessage.<anonymous> (/.../v                                                                                            k/node_modules/vksdk/sdk.js:307:31)
5|index    |     at emitNone (events.js:91:20)
5|index    |     at IncomingMessage.emit (events.js:185:7)
5|index    |     at endReadableNT (_stream_readable.js:974:12)


Модифицировал код, ошибка продолжается - важная ремарка, при повторному обращению к сайту.
index.js

app.get('/getwall/:action?/:id?',vk.getWall, function(req, res) {
        res.render('home', {view:'vk'});
});


vk.js
exports.getWall = function (req, res, next) {
  if(req.query.id)
    vk.setSecureRequests(true);
    vk.request('wall.get',{'owner_id' : req.query.id});
    vk.on('done:wall.get', function (_o) {
      console.log(req.query.id);
        if(_o) {
          req.wall =  {vk: JSON.stringify(_o, null, 4)};
          next();
        }
    });
};
  • Вопрос задан
  • 1376 просмотров
Решения вопроса 2
Udjine
@Udjine
Программист студии True.Code
Если вы что-то res.send[.render, .end и т.п.], то после уже ничего отправлять не нужно, иначе будет эта ошибка.
Ответ написан
Комментировать
ogregor
@ogregor Автор вопроса
арендатор vpn сервера debian
Было 2 ошибки.
1) vk.on('done:wall.get', function (_o) - каждый раз создавался эвент листенер => надо once()
2) Типичная ошибка, когда после условия и рендера поток продолжал выполняться и производился альтернативный рендер => return перед рендером.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@LiguidCool
Вам тонко намекают, что хедеры надо устанавливать до отправки основных данных. Типа "фарш невозможно провернуть назад".
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы