Error: ESOCKETTIMEDOUT but doesn't seem to be DNS like other SO posts suggest
Error: ESOCKETTIMEDOUT but doesn't seem to be DNS like other SO posts suggest
我在使用 npm request
包时遇到了一些问题,并让它正确调用任何 URL 除非 URL 是针对已关闭的服务器。例如,我无法调用 amazon.com
,但我可以调用 dev.personalDomain.com
,它指向一个完全关闭的 EC2 实例。
我试图剥离应用程序逻辑以使其只产生错误。
对于此示例,假设 monitor.body.url = 'amazon.com'
是一个字符串
我的代码
request({url: `http://${monitor.body.url}`, timeout: 20}, function (error, response, body) {
console.log(`Response: ${response}`);
console.log(`Body: ${body}`);
console.log(`Error: ${error}`);
if(error == 'ENOTFOUND' || error == 'ETIMEDOUT') {
response.statusCode = 500;
}
if(error || response.statusCode < 200 && response.statusCode > 299 || !response.statusCode) {
if(!response || !response.statusCode) response.statusCode = 500;
// Application logic
}
// If nothing went wrong just console.log -- This is used for debugging not useful in prod
if(!error || response.statusCode > 299 || response.statusCode < 200)console.log(`Successfully called ${monitor.body.url}`);
});
错误信息
Response: undefined
Body: undefined
Error: Error: ESOCKETTIMEDOUT
/home/ec2-user/environment/service/app.js:91
if(!response || !response.statusCode) response.statusCode = 500;
^
TypeError: Cannot set property 'statusCode' of undefined
我继续查看 google/SO,发现可能是 DNS 导致了这个问题,我使用 test/resolve:
const dns = require("dns");
dns.setServers(['8.8.8.8', '1.1.1.1']);
这对上面请求的结果没有任何改变。
有人对这可能是什么有建议或想法吗?我没有运气找到一个接近并产生相同错误消息的示例。
编辑**
我的 DNS 在我的开发机器上完全正常,所以那里的问题为零。另外,当我 request({'http://${monitor.body.url}', function (error, response, body) {
时我没有遇到这个问题,所以我使用请求
的方式似乎是错误的
解决了问题。我的编辑给出了它可能是什么的想法......所以我与 Request 一起使用的超时实际上以毫秒为单位,而不是我认为的秒数。所以它在 20 毫秒后超时,导致错误甚至 DNS 都没有正确完成。我将其更改为实际 20 秒,问题似乎已解决。
我在使用 npm request
包时遇到了一些问题,并让它正确调用任何 URL 除非 URL 是针对已关闭的服务器。例如,我无法调用 amazon.com
,但我可以调用 dev.personalDomain.com
,它指向一个完全关闭的 EC2 实例。
我试图剥离应用程序逻辑以使其只产生错误。
对于此示例,假设 monitor.body.url = 'amazon.com'
是一个字符串
我的代码
request({url: `http://${monitor.body.url}`, timeout: 20}, function (error, response, body) {
console.log(`Response: ${response}`);
console.log(`Body: ${body}`);
console.log(`Error: ${error}`);
if(error == 'ENOTFOUND' || error == 'ETIMEDOUT') {
response.statusCode = 500;
}
if(error || response.statusCode < 200 && response.statusCode > 299 || !response.statusCode) {
if(!response || !response.statusCode) response.statusCode = 500;
// Application logic
}
// If nothing went wrong just console.log -- This is used for debugging not useful in prod
if(!error || response.statusCode > 299 || response.statusCode < 200)console.log(`Successfully called ${monitor.body.url}`);
});
错误信息
Response: undefined
Body: undefined
Error: Error: ESOCKETTIMEDOUT
/home/ec2-user/environment/service/app.js:91
if(!response || !response.statusCode) response.statusCode = 500;
^
TypeError: Cannot set property 'statusCode' of undefined
我继续查看 google/SO,发现可能是 DNS 导致了这个问题,我使用 test/resolve:
const dns = require("dns");
dns.setServers(['8.8.8.8', '1.1.1.1']);
这对上面请求的结果没有任何改变。
有人对这可能是什么有建议或想法吗?我没有运气找到一个接近并产生相同错误消息的示例。
编辑**
我的 DNS 在我的开发机器上完全正常,所以那里的问题为零。另外,当我 request({'http://${monitor.body.url}', function (error, response, body) {
时我没有遇到这个问题,所以我使用请求
解决了问题。我的编辑给出了它可能是什么的想法......所以我与 Request 一起使用的超时实际上以毫秒为单位,而不是我认为的秒数。所以它在 20 毫秒后超时,导致错误甚至 DNS 都没有正确完成。我将其更改为实际 20 秒,问题似乎已解决。