我在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并测试/解决我使用的问题:
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秒,问题似乎已经解决了。