Проблема с эластичным бобовым стеблем: истечение времени соединения при запуске моего Node.js Экспресс-сервер

#node.js #reactjs #amazon-web-services #express #amazon-elastic-beanstalk

#node.js #reactjs #amazon-веб-сервисы #экспресс #amazon-elastic-beanstalk

Вопрос:

Я пытаюсь развернуть свое приложение MERN на Elastic Beanstalk и, похоже, сталкиваюсь с последней проблемой, которую я просто не могу решить.

Мое приложение отлично работает при локальном запуске моего сервера (запущенный сервер узла), но при запуске на elastic beanstalk страница никогда не загружается.

После проверки статические элементы не загружаются, как видно из инструментов разработки:

Изображение, показывающее ERR_CONNECTION_TIMED_OUT в инструментах разработки

Я проверил все журналы EB и не нашел никаких ошибок или полезных сообщений. Я думаю, проблема в том, что EB каким-то образом не может найти мои статические файлы. Однако, мои файлы сборки не игнорируются git и развертываются в EB.

Вот некоторая информация о моем проекте: мой серверный и клиентский код находятся в одном проекте со следующей структурой:

  • проект
    • server.js
    • интерфейс
      • сборка
        • статический
        • index.html

Я запускаю свое приложение, создавая сайт react, затем запускаю «сервер узлов», который отлично работает

Вот соответствующий код из моего server.js :

 const port = process.env.PORT || 8081;

app.use(express.static(path.join(__dirname, 'frontend/build')));

app.get('/*', function (req, res) {
    res.sendFile(path.join(__dirname, 'frontend/build/index.html'));
});

app.listen(port, () => {
    console.log(`Server is running on port: ${port}`);
});
  

Сервер успешно отправляет журналы о том, что сервер запущен и что база данных установила соединение. Итак, кажется, что сервер в порядке, проблема просто в интерфейсе.

файл конфигурации eb:

 option_settings:
  aws:elasticbeanstalk:container:nodejs:
    NodeCommand: "npm start"
  aws:elasticbeanstalk:application:environment:
    PORT: 8081
    NODE_ENV: production
  aws:elasticbeanstalk:container:nodejs:staticfiles:
    /static: /frontend/build/static
  

Я не знаю, как это решить. EB был развернут через CLI, и я не перепутал ни с какими настройками. Я сообщаю EB, где находятся мои статические файлы, и я полагаю, что он скажет «не найдено», а не «истекло время ожидания».

Любая помощь была бы оценена

Ответ №1:

Решаемая.

Проблема заключалась в использовании Helmet на моем экспресс-сервере. Я пропустил код, думая, что это не имеет значения, но вот верхняя часть server.js , причем последняя строка является соответствующей частью:

 const AWS = require('aws-sdk');
const cors = require('cors');
const express = require('express');
const helmet = require('helmet');
const mongoose = require('mongoose');
const path = require('path');
let Download = require('./models/Download.js');

require('dotenv').config();

const app = express();
const port = process.env.PORT || 8081;

app.use(helmet());
  

Отсутствие использования helmet решает проблему.

Честно говоря, я не уверен, почему это проблема. Я предполагаю, что проблема в том, что шлем обеспечивает некоторую безопасность, которую просто не обеспечивает мой EB с голыми костями.

РЕДАКТИРОВАТЬ: В частности, проблема связана с CSP. Для устранения проблемы достаточно установить contentSecurityPolicy в значение false в Helmet.