NodeJS res.on end不会被触发

时间:2014-03-07 05:07:46

标签: 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,
        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();
});

提前致谢。人

1 个答案:

答案 0 :(得分:2)

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

  1. 将此处的res ivar更改为类似_res的内容,以便它与我们的主要请求的res不冲突:var req = https.get(optionsA, function(_res) {。在https.get块中的其他位置也进行类似的更改。

  2. res.send()块中删除res.on("end")

  3. 现在是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.
    
  4. 您的当前代码可能无法正常工作,因为您的代码中有两个res ivars,并且节点认为新res是您要发送数据的地址。