NodeJS Express变得无响应并获得超时

时间:2014-11-11 22:23:19

标签: node.js express node-request

我有一种感觉我某处有某种泄漏,但我不确定如何识别或排除故障。我使用express和nodejs的请求模块。在加载时,通过请求对Facebook Graph API进行的https调用开始经历长时间的延迟或完全超时。起初我认为这是接收方(Facebook)上的一个限制问题,但是如果我创建一个简单的C#控制台应用程序,它会调用相同的URL几百次,那么响应时间都不会大于150ms。但是,节点中的相同代码从50ms到最多10s不等。如果我在使用请求时设置了超时属性,我开始收到ESOCKETTIMEDOUT错误。如果我将请求选项上的pool.maxsize设置为100,那么我会收到ETIMEDOUT错误。

如何判断我的挂机位置?

这是我使用请求模块的示例。我也尝试将其添加到我的应用中:

require('http').globalAgent.maxSockets = Infinity;
require('https').globalAgent.maxSockets = Infinity;



var executeGetUrl = function getUrl(url, cacheKey, parseJson, accessToken, callback) {

    if (accessToken) {
        url = url + '?access_token=' + accessToken;
    }

    try {
        request({url: url, timeout: 10000, 'pool.maxSockets' : 100}, function (err, res, body) {
            if (err) {
                logger.error('Made facebook api call to ' + url + ' with error ' + err);
                callback(err, null);
                return;
            }

            if (parseJson) {
                try {
                    body = JSON.parse(body);
                } catch (err) {
                    callback(new Error('Could not parse ' + res.body + ': ' + err), null);
                    return;
                }

                if (body.error) {
                    err = new Error('Error calling ' + url + '. ' + body.error.message);
                    err.code = body.error.code;
                    callback(err, null);
                }
                else {
                    callback(null, body || {});
                }
            } else {
                if (res.statusCode != 200) {
                    callback(new Error(res.body));
                } else {
                    callback(null, res.body || {});
                }
            }
        });
    } catch (err) {
        callback(null, err);
    }
};

我将结果记忆60秒,但这似乎与问题没有任何关系

var getUrl = memoize(executeGetUrl, {async: true, maxAge: 60000, length: 2});

使用承诺链中的函数

    var deferred = q.defer();

    getUrl(photosUrl, null, false, null, function (err, body) {

        if (err) {
            deferred.reject(err);
            return;
        }
        deferred.resolve(body);
    });

    return deferred.promise;

0 个答案:

没有答案