m0sk1t
@m0sk1t
SPA web-developer

Node.js express.js: как подружить redirect с cookie чтоб и куки устанавливались и редирект происходил?

Суть в чём: делаю приложение, которое получает авторизационные данные через другой веб-сервер
и ставит у клиента куки, полученные с него. Вот кусок кода:
var params = null, response = res, query = require('url').parse(req.url,true).query,
		qs = require('querystring');
	var options = {
		host: outhost,
		port: 8080,
		path: '/auth?action=logon&'+qs.stringify({login:query.login},{password:query.password}),
		method: 'GET'
	};
	http.get(options, function(res) {
		res.setEncoding('utf8');
		console.log('STATUS: ' + res.statusCode);
		console.log('HEADERS: ' + JSON.stringify(res.headers));
	});.on('data', function (chunk) {
		console.log(chunk.toString());
		params = JSON.parse(chunk);
		response.cookie('ssid', params.ssid).cookie('sessionurl', params.sessionurl);
	});.on('end', function () {
		response.redirect('/index');
		});

Сервер вылетает с ошибкой:
Can't set headers after they are sent

Я конечно понимаю что редирект через header прописывается, но вот почему с куками так? ЧЯДНТ?
  • Вопрос задан
  • 4988 просмотров
Решения вопроса 1
@quex
куки тоже через хедеры ставятся :)
у вас в обработчике on('data', ... ) ошибка. вам название переменной chunk должно было об этом намекнуть. при получении данных событие data наступает многократно - данные приходят не сразу, а кусочками, каждый кусочек - chunk. вам сперва нужно эти кусочки собрать, а потом уже с ними манипулировать.
...
var buffer = '';
...
http.get(options).on('data', function(chunk){
    buffer += chunk.toString();
}).on('end',function(){
     params = JSON.parse(buffer);
     response.cookie('ssid', params.ssid).cookie('sessionurl', params.sessionurl);
     response.redirect('/index');
});

как-то так.

А вообще, мне почему-то кажется, что если одновременно установлены хедеры Set-cookie и Location, Set-cookie проигнорируется, но я не уверен.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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