node.js - 无法通过节点应用程序访问 docker 容器内的 url,但 curl 到相同的 url 有效
问题描述
我正在开发一个尝试访问 url 的微服务。设置了授权和内容类型的标头。NPM 工作正常。
使用 curl 访问带有 Authorization 标头的相同 url 也会给出结果。但是我在通过完整代码点击 url 时遇到了这个错误。
"message":"3. Error while making request - Error: tunneling socket could not be established, cause=connect EINVAL 0.0.12.56:80 - Local (0.0.0.0:0)","level":"error"}
代码使用 request-promise-native 模块
const request = require('request-promise-native')
const logger = require(process.env.APP_SERVICES_DIR + 'logger');
function getRequestAPI(task) {
console.log(`Basic ${Buffer.from(
`${process.env.USERNAME}:${process.env.PASSWORD}`
).toString('base64')}`);
return {
url: getQueryForTask(task),
headers: {
Authorization: `Basic ${Buffer.from(
`${process.env.USERNAME}:${process.env.PASSWORD}`
).toString('base64')}`,
'Content-Type': 'application/json'
},
resolveWithFullResponse: true
};
}
function makePortalRequest(task) {
logger.info(`Making request for task ${task.task_key}`);
return request(getRequestAPI(task))
.then(response => {
// logger.info('Response received');
console.log("get request API" );
try {
const responseBody = JSON.parse(response.body);
// Parse result and store
return parseResultAndStore(responseBody, task).then(() => {
return {
success: true
};
});
} catch (e) {
logger.error(
`Fetch Task: Error in parsing response from portal - ${e.message}`,
e
);
return {
success: false,
message: e.message
};
}
})
.catch(e => {
let errResponse = e.response || e.message;
if (errResponse.body) {
let responseBody = '';
// wrap JSON parse in try catch
try {
responseBody = JSON.parse(errResponse.body);
errResponse = `${
errResponse.statusMessage
} : ${responseBody.errorMessages.toString()}`;
logger.error(`1. Error while making request - ${errResponse}`);
} catch (e) {
// if JSON parse fails log the string
logger.error(
`2. Error while making request - ${errResponse.body}`
);
errResponse = errResponse.body;
}
} else {
logger.error(`3. Error while making request - ${errResponse}`);
}
return {
success: false,
message: errResponse
};
});
}
该服务在 docker 容器中运行。服务组件由 docker-compose 文件描述,所有环境变量都已适当设置。通过运行下面的命令,我可以在 docker 容器中打开 bash。
docker-compose exec run service-name bash
curl 命令能够从 docker bash 内部访问 url。
curl -X GET 'https://url-to-fetch/?params=xyz' -H 'Authorization: Basic aDEwMjZzNzpXaXB0ZWxAMjAxOF8='
但在运行代码中,我无法从 url 获得输出响应。
"message":"3. Error while making request - Error: tunneling socket could not be established, cause=connect EINVAL 0.0.12.56:80 - Local (0.0.0.0:0)","level":"error"}
如何解决这个问题?此错误的可能原因是什么?
解决方案
推荐阅读
- python - Django - 上下文变量在哪里?
- terraform - 在特定 terraform 模块中输出私有 DHCP IP
- java - sun.misc.Launcher$AppClassLoader.loadClass为什么会出现在堆栈中
- javascript - jquery 将表单输入保存到对象数组中然后显示它们,得到未捕获的 typeError
- reactjs - 如何使用 onchange 设置具有来自 TextField 的值的状态数组
- arrays - 在 Swift 4.1 中,如何对数组进行混洗或随机化,以使结果数组的元素总和始终等于固定值?
- xml - 我如何重用复杂类型来定义自身的序列(XML 模式)
- python - 如何在 Python 中快速无延迟地循环 WAV 文件?
- ios - 如何使用 UIPinchGestureRecognizer 速度
- google-sheets - 计算间隔中给定字符的出现次数