【问题标题】:NodeJS res.on end is not triggeredNodeJS res.on end 没有被触发
【发布时间】:2014-03-07 05:07:45
【问题描述】:

我在将响应数据发送给客户端时遇到问题。响应不会发送到客户端,不会触发 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();
});

提前致谢。伙计们。

【问题讨论】:

    标签: javascript node.js express redis httprequest


    【解决方案1】:

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

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

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

    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.
      

    您当前的代码可能无法正常工作,因为您的代码中有两个 res ivars,并且节点认为新的 res 是您要发送数据的地方。

    【讨论】:

      猜你喜欢
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-22
      • 2012-06-03
      • 2019-11-07
      • 2018-09-01
      • 2018-12-03
      相关资源
      最近更新 更多