![使用 Docker 在 NodeJS 上请求外部 API 很慢](https://linux22.com/image/766073/%E4%BD%BF%E7%94%A8%20Docker%20%E5%9C%A8%20NodeJS%20%E4%B8%8A%E8%AF%B7%E6%B1%82%E5%A4%96%E9%83%A8%20API%20%E5%BE%88%E6%85%A2.png)
我正在尝试让 NodeJS 服务器响应来自外部 API 的数据。考虑index.js文件:
const express = require('express');
const axios = require('axios');
const app = express();
app.get('/api', async function (req, res) {
url = 'http://freegeoip.app/json/';
// external API request
var ax = axios.get(url)
.then(function(data) {
res.json(data.data)
})
.catch(function(err) {
res.status(404);
})
})
app.listen(3000);
当我访问http://localhost:3000/apiJSON 数据来自http://freegeoip.app/json/在 500 毫秒内呈现并加载。
问题是我的生产中的 NodeJS 服务器在 Docker 容器中运行。在我的 Docker 容器中运行完全相同的代码大约需要 5 秒钟才能加载。我怀疑这是 Docker 容器的 DNS 解析问题。有没有办法显示使用 axios 的外部 API 请求所花费的时间?如果这是 DNS 问题,它似乎只会影响 NodeJS,因为我可以从另一个 Docker 容器中使用 curl。
以下是供参考Dockerfile和docker-compose.yml:
FROM node:15.14.0-alpine3.13
WORKDIR /backend
RUN npm install express
RUN npm install axios
RUN npm install -g nodemon
COPY . .
CMD ["nodemon", "/backend/index.js"]
version: '3'
services:
backend:
restart: always
build: ./backend
volumes:
- ./backend:/backend
- /backend/node_modules
ports:
- "3000:3000"
答案1
这是 DNS 问题。偶然发现此 Stack Overflow 帖子,可以在 docker-compose.yml 文件中指定 DNS 服务器。API 数据现在的加载速度与浏览器一样快。
version: '3'
services:
backend:
restart: always
build: ./backend
volumes:
- ./backend:/backend
- /backend/node_modules
ports:
- "3000:3000"
dns:
- 8.8.8.8