@whireless

Ошибка ERR_CONNECTION_REFUSED, что не так?

Всем привет, подскажите, в чём проблема? Делаю POST-запрос с сайта на удалённый сервер (расположены на одной машине), в консоль падает это:

Chrome - ERR_CONNECTION_REFUSED
Firefox - TypeError: NetworkError when attempting to fetch resource.

Сам запрос:
const sendData = async (mail) => {
  try {
    const response = await fetch(
      'https://example.com:3000/server/',
      {
        method: 'POST',
        mode: 'no-cors',
        headers: {
          'Content-Type': 'text/plain',
        },
        body: mail,
      }
    );
    const data = await response.text();
    console.log(data);
  } catch (error) {
    console.log(error);
  } 
};


Вот сервер:
const https = require('node:https');
const app = require('express')();
const fs = require('node:fs');

const host = 'example.com/server';
const port = 3000;

const options = {
  key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'),
  cert: fs.readFileSync('/etc/letsencrypt/live/example.com/cert.pem'),
};

app.post('/', (req, res) => {
  let mail = '';
  req.on('data', chunk => {
    mail += chunk
  });
  req.on('end', () => {
    console.log(mail);
  });
  res.send('Отправили программу!');
});

https.createServer(
  options,
  app,
).listen(port, host, () => {
  console.log(`Привет от сервера! https://${host}:${port}`);
});
  • Вопрос задан
  • 679 просмотров
Решения вопроса 1
TemaSM
@TemaSM
Fullstack, DevOps, InfSec
Ошибка "ERR_CONNECTION_REFUSED" и "TypeError: NetworkError when attempting to fetch resource" обычно указывает на то, что удаленный сервер не доступен по указанному адресу или порту.

В вашем коде, вы указываете порт 3000 в запросе на https://example.com:3000/server/, но в коде сервера, вы слушаете порт 3000 на хосте example.com/server.
Чтобы исправить это, вам нужно изменить значение host в коде сервера на example.com и удалить /server из пути запроса:
const host = 'example.com';
const port = 3000;

// ...

app.post('/server', (req, res) => { // изменить путь на /server
  // ...
});


Дополнительное, не обязательное:

Кроме того, вы используете режим "no-cors" в запросе fetch, что означает, что запрос будет выполнен без использования CORS (Cross-Origin Resource Sharing), что может привести к блокировке запроса браузером из-за политики безопасности CORS. Если вы контролируете и настраиваете сервер, на который отправляете запрос, лучше использовать стандартный режим "cors" или "same-origin".
const response = await fetch(
  'https://example.com/server/', // изменить путь на /server
  {
    method: 'POST',
    // mode: 'no-cors', // удалить эту строку
    headers: {
      'Content-Type': 'text/plain',
    },
    body: mail,
  }
);

После проверки параметров host, port и внесения изменений, ваш POST запрос должен пройти успешно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы