0

I am trying to have a NodeJS server respond with data from an external API. Consider the index.js file:

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); 

When I visit http://localhost:3000/api the JSON data from http://freegeoip.app/json/ is presented and loads within 500 ms.

The problem is my NodeJS server in production runs within a Docker container. Running the exact same code in my Docker container takes approximately 5 seconds to load. I suspect this is a DNS resolution issue from the Docker container. Is there a way to show time spent on an external API request with axios? If this is a DNS issue, it seems to only affect NodeJS as I can curl from another Docker container.

For reference below is the Dockerfile and 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 Answer 1

0

It was a DNS issue. After stumbling across this Stack Overflow post, the DNS server can be specified in the docker-compose.yml file. The API data now loads just as fast as the browser.

version: '3' services: backend: restart: always build: ./backend volumes: - ./backend:/backend - /backend/node_modules ports: - "3000:3000" dns: - 8.8.8.8 

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.