我有一种感觉我某处有某种泄漏,但我不确定如何识别或排除故障。我使用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;