我遇到问题,最终客户端的响应数据。响应未发送到客户端,不会触发res.on('end')。我不知道让这些事情奏效。我的目标是将检索到的数据以redis形式发送给客户端。有没有办法让这项工作?顺便说一句,这是我的代码人。感谢
app.get('/contacts/list', function(req, res) {
var someId = null;
var someData;
var optionsA = {
hostname: host,
path: checkHeaders,
headers: {
'Content-Type': 'application/json',
'someheaders1': req.headers.someheaders1,
'someheaders2': req.headers.someheaders2,
'someheaders3': req.headers.someheaders3,
'someheaders4': req.headers.someheaders4,
'user-agent': req.headers['user-agent'],
'local': req.header('x-forwarded-for') || req.connection.remoteAddress
}
};
var req = https.get(optionsA, function(res) {
res.on('data', function(chunk) {
if (res.statusCode === 200) {
userId = chunk;
redisc.smembers('setId:' + someId, function(err, data) {
if (!err) {
someData = data;
} else {
console.log(err);
}
});
} else {
console.log('404');
}
});
res.on('end', function() {
res.send(someData);
console.log('end');
});
});
req.on('error', function(e) {
console.log('ERROR: ' + e.message);
});
res.end();
});
提前致谢。人
答案 0 :(得分:2)
鉴于您的redisc.smembers
查询本质上是异步的,您必须进行以下编辑:
将此处的res ivar更改为类似_res的内容,以便它与我们的主要请求的res不冲突:var req = https.get(optionsA, function(_res) {
。在https.get块中的其他位置也进行类似的更改。
从res.send()
块中删除res.on("end")
。
现在是https.get和redis块
var _req = https.get(optionsA, function(_res) {
_res.on('data', function(chunk) {
if (_res.statusCode === 200) {
userId = chunk;
redisc.smembers('setId:' + someId, function(err, data) {
if (!err) {
res.send(data); //you probably want to wrap data inside JSON.stringify()
res.end();
} else {
console.log(err);
}
});
} else {
console.log('404');
}
});
_res.on('end', function() {
console.log('end');
});
});
_req.on('error', function(e) {
console.log('ERROR: ' + e.message);
});
res.end()// Remove this line. It is prematurely closing your connection without sending any data. I've only included it here to show what needs to be done.
您的当前代码可能无法正常工作,因为您的代码中有两个res
ivars,并且节点认为新res是您要发送数据的地址。