Задать вопрос
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();
        }
    });
};
  • Вопрос задан
  • 1379 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 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
Вам тонко намекают, что хедеры надо устанавливать до отправки основных данных. Типа "фарш невозможно провернуть назад".
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы