我在 Node.js 中设置了一个代理,可以访问我们的后端服务器之一来获取数据;其中一些数据(例如 session ID)存储为 cookie。我想要做的是让代理获取远程 cookie,然后将其推送到原始请求的响应 header 中,然后将响应发回。我很接近,但遇到了障碍:
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) 只是循环遍历 cookies 并执行 res.setHeader('Set-Cookie', cookie)
问题在于,在调用第二个 setCookies 时, header 似乎已被烘焙;将方法移至“数据”事件处理程序没有帮助。我得到的错误是:
http.js:689
throw new Error('Can\'t set headers after they are sent.');
有什么方法可以将 header 添加到我从response2收到的response1吗?
<小时/>更新
我修复了代码,以确保在任何其他写入之前尝试写入response1的 header ;然而,这并不是一个解决办法。
最佳答案
是的,数据开始流动后您无法发送 header 。您是否尝试在此行之后设置标题?
response.setEncoding('utf8');
此外,您是否考虑过使用流而不是分块传输? http://nodejs.org/api/stream.html
关于javascript - 以 Express 方式跨域传输 Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25189681/