【发布时间】:2014-08-08 04:29:46
【问题描述】:
我在 nodejs 中设置了一个代理,它可以连接到我们的一个后端服务器获取数据;其中一些数据(例如会话 ID)存储为 cookie。我想要做的是让代理获取远程cookie,然后将其推送到原始请求的响应标头中,然后将响应发回。我很接近,但遇到了障碍:
app.get(/\/json\/(.+)/, getJson);
var getJson = function(req, response1) {
response1.setHeader('Content-Type', 'application/json; charset=utf-8');
var before1stWrite = true;
utils.setCookies(response1, ["floo=flum"]) // this works
var options = {
host : config.scraperUrl.replace('http://', ''),
path : '/rwd/' + req.params[0] + '?' + querystring.stringify(req.query),
method : "GET",
rejectUnauthorized : false
};
var request = https.request(options, function(response2) {
response2.setEncoding('utf8');
// utils.setCookies(response1, ["flib=flah"]) // this fails, too
response2.on('data', function(d) {
if (before1stWrite) {
console.log(response2.headers['set-cookie']); // remote's cookies
utils.setCookies(response1, ["flib=flah"]) // this fails
before1stWrite = false;
}
response1.write(d);
});
response2.on('end', function() {
response1.end()
});
});
request.end();
request.on('error', function(e) {
console.error("error occurred: " + e.message);
response1.end();
});
}
setCookies(response1, cookies) 只是循环通过 cookie 并执行 res.setHeader('Set-Cookie', cookie)
问题在于,在调用第二个 setCookies 时,标头似乎已经烘焙;将方法移至“数据”事件处理程序无济于事。我得到的错误是:
http.js:689
throw new Error('Can\'t set headers after they are sent.');
有什么方法可以将标头添加到我从 response2 收到的 response1 中?
更新
我修复了代码以确保尝试写入 response1 的标头在任何其他写入之前完成;然而,这不是解决办法。
【问题讨论】:
标签: javascript node.js cookies express