Nodejs http.get()或http.request()在Azure上报错 connect EADDRNOTAVAIL
Nodejs http.get()或http.request()在Azure上报错 connect EADDRNOTAVAIL
试用Azure,程序中有一个用到http.get()和http.request()向Google APIs请求数据,在本地是OK的,但是在Azure上报错。报错信息如下。请问有类似经验的童鞋吗?
Thu May 23 2013 07:35:14 GMT+0000 (Coordinated Universal Time): Unaught exception: Error: connect EADDRNOTAVAIL
at errnoException (net.js:670:11)
at connect (net.js:548:19)
at Socket.connect (net.js:613:5)
at Object.<anonymous> (net.js:77:12)
at new ClientRequest (http.js:1091:25)
at Object.request (http.js:1427:10)
at Object.getCityByLatLng (C:\DWASFiles\Sites\nearby\VirtualDirectory0\site\wwwroot\dianping.js:9:23)
at C:\DWASFiles\Sites\nearby\VirtualDirectory0\site\wwwroot\server.js:26:27
at Parser.<anonymous> (C:\DWASFiles\Sites\nearby\VirtualDirectory0\site\wwwroot\node_modules\xml2js\lib\xml2js.js:246:20)
at Parser.emit (events.js:67:17)
Application has thrown an uncaught exception and is terminated:
Error: connect EADDRNOTAVAIL at errnoException (net.js:670:11) at connect (net.js:548:19) at Socket.connect (net.js:613:5) at Object.<anonymous> (net.js:77:12) at new ClientRequest (http.js:1091:25) at Object.request (http.js:1427:10) at Object.getCityByLatLng (C:\DWASFiles\Sites\nearby\VirtualDirectory0\site\wwwroot\dianping.js:9:23) at C:\DWASFiles\Sites\nearby\VirtualDirectory0\site\wwwroot\server.js:26:27 at Parser.<anonymous> (C:\DWASFiles\Sites\nearby\VirtualDirectory0\site\wwwroot\node_modules\xml2js\lib\xml2js.js:246:20) at Parser.emit (events.js:67:17)
Nodejs http.get() 或 http.request() 在 Azure 上报错 connect EADDRNOTAVAIL
问题描述
在使用 Azure 部署 Node.js 应用时,尝试通过 http.get()
或 http.request()
向 Google APIs 请求数据时,遇到以下错误:
Error: connect EADDRNOTAVAIL
该错误表明在尝试连接到指定地址时失败了。
原因分析
EADDRNOTAVAIL
错误通常表示你的应用尝试连接到一个不可用的 IP 地址。这可能是由于以下几个原因导致的:
- 网络配置问题(如防火墙、网络策略等)
- DNS 解析问题
- Azure 环境中的限制
解决方案
解决这个问题的方法之一是确保你的应用能够正确解析外部域名并建立连接。下面是一个示例代码,展示了如何处理这个问题。
示例代码
const http = require('http');
function requestGoogleAPI() {
const options = {
hostname: 'maps.googleapis.com',
port: 80,
path: '/maps/api/geocode/json?latlng=37.422,-122.084&key=YOUR_API_KEY',
method: 'GET'
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log(data);
});
});
req.on('error', (e) => {
console.error(`Problem with request: ${e.message}`);
});
req.end();
}
requestGoogleAPI();
解释
- 选项配置:我们定义了一个
options
对象,其中包含了请求的基本信息,包括hostname
、port
和path
。 - 请求创建:使用
http.request()
方法创建一个 HTTP GET 请求,并传入options
。 - 响应处理:在
req
对象上监听error
事件,如果发生错误则打印错误信息。 - 结束请求:调用
req.end()
来发送请求。
注意事项
- 确保你已经正确设置了 Google API 密钥。
- 如果你使用的是 Azure App Service,请检查你的应用程序是否具有访问互联网的权限。
- 检查是否有任何网络策略或防火墙规则阻止你的应用访问外部资源。
通过以上步骤,你应该能够解决在 Azure 中使用 http.get()
或 http.request()
时报错 connect EADDRNOTAVAIL
的问题。
看起来像是端口紧缺
在Azure上使用Node.js的http.get()
或http.request()
方法时遇到EADDRNOTAVAIL
错误,通常是因为尝试连接到一个不可用的IP地址。这可能是由于Azure的网络配置限制了某些外部IP的访问。
解决方案
1. 检查目标URL
确保你请求的目标URL(如Google API)是可访问的,并且没有被Azure的安全策略阻止。有时候,Azure可能不允许直接访问某些外部IP地址。
2. 使用代理
如果直接访问不成功,可以尝试通过代理服务器来请求外部API。Azure提供了内部的代理服务,或者你可以配置一个外部代理服务器。
示例代码
下面是一个使用代理服务器的例子:
const http = require('http');
const options = {
hostname: 'proxy.example.com', // 替换为你的代理服务器地址
port: 8080, // 替换为你的代理服务器端口
path: 'https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&key=YOUR_API_KEY',
method: 'GET'
};
const req = http.request(options, res => {
let data = '';
res.on('data', chunk => {
data += chunk;
});
res.on('end', () => {
console.log(data);
});
});
req.on('error', error => {
console.error(`Problem with request: ${error.message}`);
});
req.end();
注意事项
- 确保代理服务器地址和端口正确。
- 在生产环境中,使用更安全的HTTPS代理服务。
如果你确定代理服务器可用,尝试将上述代码片段替换到你的应用中,看看是否能解决问题。