Клиент javascript не может в службе создания докеров не может получить из node.js API

У меня есть файл docker-compose.yml (тестовая настройка), который содержит 3 службы: api узлов (api), интерфейс html php (clientphp) и интерфейс html/javascript, который должен заменить интерфейс php, но я не могу получить это работает (clientjs).

  1. API-интерфейс Node.js, который возвращает объект JSON с именем API
{
  "products": [
    "icecream",
    "milk",
    "fries",
    "cheese",
    "oranges",
    "bananas"
  ]
}
  1. HTML-страница с php-кодом, извлекающим json из http://api:3000/ и создающим ul с именем clientphp. Работает отлично!
<html> 
    <head>
        <title>My Shop</title> 
    </head> <body>
    <h1>Welcome to my shop</h1> 
    <ul>
        <?php
        $json = file_get_contents('http://api:3000/'); 
        $obj = json_decode($json);
        $products = $obj->products;
        foreach ($products as $product) { 
            echo "<li>$product</li>";
        }
        ?> 
</ul>  </body> </html>

  1. клиент javascript, пытающийся получить код из API, который вообще не будет работать. Он не может найти http://api:3000/. Если я заменю имя службы на IP-адрес контейнера, я просто выдам случайную ошибку об отклонении необработанного обещания. Этот сервис называется clientjs
  fetch('http://api:3000/', { mode: 'no-cors'})        //this won't work, replacing the api in the url with the IP address will the server not found error. 
  .then(res => console.info(res))
  .then(response => response.json())
  .then(data => {
    console.table(data);
    return data;
  })
  .catch(e => {
    console.info(e);
    return e;
  });
[Log] TypeError: Load failed (index.js, line 30)
[Error] Unhandled Promise Rejection: Not implemented on this platform
    (anonymous function)
    rejectPromise
    reject
    (anonymous function) (content-script.js:80:377615)
    n (content-script.js:80:115)
    (anonymous function) (content-script.js:80:906)
    Global Code (content-script.js:80:915)
[Error] Failed to load resource: A server with the specified hostname could not be found. (api, line 0)
[Log] TypeError: Load failed (index.js, line 30) 

Докерфайл:

FROM node
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install -y
COPY index.js ./ 
EXPOSE 3000
CMD node index.js

Файл docker-compose.yml:

version: '3'
services:
  api:
    build: .
    volumes:
      - .:/home/node/app
    ports:
      - 5001:3000
  client:
    image: nginx
    volumes:
      - ./clientjs:/usr/share/nginx/html/
    ports:
      - 5002:80
    depends_on:
      - api
  php-client:
    image: php:apache
    volumes:
      - ./clientphp:/var/www/html
    ports: 
      - 5003:80
    depends_on:
      - api
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
172
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

PHP работает на клиентском экземпляре докера. Запросы от него поступают от этого клиента к API внутри виртуальной сети, созданной конфигурацией Docker Compose.

JavaScript передается из экземпляра клиентской докеры в браузер (который не работает в виртуальной сети), а JavaScript выполняется в браузере.

Браузер не может найти http://api:3000, потому что он не является частью этой виртуальной сети.

Конфигурация портов API такова 5001:3000, поэтому, если я правильно помню свой Docker, вам нужно сделать запрос на http://localhost:5001/

Это имеет большой смысл, когда вы так говорите, спасибо!

WestMD 05.10.2022 13:49

Другие вопросы по теме