【问题标题】:Node js infinite loop节点js无限循环
【发布时间】:2013-11-02 05:41:42
【问题描述】:

我有一个节点服务器,它从 php 服务器中提取信息并通过回调将其发送到需要的位置。一到两次广告日,服务器陷入无限循环,我认为这是因为我没有正确处理 php 和节点服务器之间的连接。我在下面发布了我的身份验证代码。有人有什么想法吗?

exports.authenticate = function(request, callback) {
   var https = require('https');

   var options = {
            hostname: 'www.mysite.com',
            port: 443,
            path: '/site/chatauth?id=' + request.sessionID,
            method: 'GET',
    };
    var req = https.request(options, function(res) {
        //console.log("statusCode: ", res.statusCode);
        // console.log("headers: ", res.headers);

         res.on('data', function(d) {
         // process.stdout.write(d);
         });
        });

    req.end();
    req.on('response', function (response) {
            var data = '';
            response.setEncoding('utf8');
            response.on('data', function(chunk) {
                    data += chunk;
            });

           // console.log (request.sessionID);

            response.on('end', function() {
                    try {
                            callback(JSON.parse(data));
                    } catch(e) {
            callback(); 
                            console.log("authentication failed");
                    }
            });
    });

};

【问题讨论】:

  • 无限循环是什么意思?它会重复记录相同的行吗?
  • 是的,它记录了相同的行。我有另一个中间件文件,它将更新侦听器,它不断达到该行并将 CPU 使用率提高到 99%。我认为这段代码中有一些东西不允许节点返回事件循环。
  • 什么线路,卡在哪里?

标签: javascript node.js loops infinite


【解决方案1】:

你确定验证功能吗?您的代码似乎很完美。你必须做两件事

1.对请求错误、请求超时和请求中止进行回调。

2.深入了解您的回调,在以下代码中,您在抛出异常时调用相同的函数。你确定吗?。如果再次达到“身份验证”功能,这可能会导致循环。

try {
    callback(JSON.parse(data));
} catch(e) {
    callback();
    console.log("authentication failed");
}

【讨论】:

    【解决方案2】:

    我在您的代码中找不到任何错误,但由于发射器/异步方式,我可能没有完全捕捉到它。

    我个人使用 npm 模块请求(简化的 HTTP 请求客户端)到目前为止没有任何问题。 您可以轻松尝试一下:

    var request = require('request');
    request({
        uri: 'https://www.mysite.com/site/chatauth?id=' + request.sessionID,
        encoding: 'utf8',
        timeout: 20000,
        strictSSL: true
    }, function (err, response, body) {
       if (err || response.statusCode !== 200) {
           // some error handling
           callback('error');
           return;
       }
       callback(null, JSON.parse(body));
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-17
      • 2023-02-25
      • 1970-01-01
      相关资源
      最近更新 更多