Javascript 未触发结束时的NodeJS res.on

Javascript 未触发结束时的NodeJS res.on,javascript,node.js,express,redis,httprequest,Javascript,Node.js,Express,Redis,Httprequest,我在向客户回复数据时遇到了一个问题。响应不会发送到客户端,res.on('end')不会被触发。我不知道该怎么办。我的目标是将redis中检索到的数据发送到客户端。有什么办法可以让这一切顺利吗?。顺便说一下,这是我的代码员。谢谢 app.get('/contacts/list', function(req, res) { var someId = null; var someData; var optionsA = { hostname: host,

我在向客户回复数据时遇到了一个问题。响应不会发送到客户端,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();
});

提前谢谢。各位。

鉴于您的
redisc.smembers
查询本质上是异步的,您必须进行以下编辑:

  • 将此处的res-ivar更改为类似于_-res的内容,这样它就不会与我们主请求的res冲突:
    var-req=https.get(optionsA,function(_-res){
    。在https.get块内的其他地方也做类似的更改

  • res.on(“结束”)
    块内部移除
    res.send()

  • 现在来看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
    ivar,节点认为新的res就是您要发送数据的地方