Экспресс-сервер возвращает 404 для некоторых путей, но не для других

#node.js #express #routes #gulp

#node.js #экспресс #маршруты #глоток

Вопрос:

У меня есть экспресс-сервер с древовидной структурой ниже:

введите описание изображения здесь

Таким образом, по сути backend , папка — это место, откуда я отправляю файлы, и у нее есть свои собственные пакеты npm. У меня есть мои представления и статические ресурсы, настроенные следующим образом:

 // backend/app.js
...
app.use('/login', controllers.login);

app.use('/images', express.static(__dirname   '/images'));
app.use('/assets', express.static(__dirname   '/assets'));

app.set('views', express.static(__dirname   '/backend/views'));
  
 // backend/controllers/login.js
...
app.get(
    '/',
    function(req, res) {
        res.render('login');
    }
)
...
  
 // package.json of root folder (i.e. outside /backend)
...
  "scripts": {
    "start": "cd backend amp;amp; npm start"
  },
...
  
 // package.json of /backend folder
...
  "scripts": {
    "start": "gulp prep amp;amp; pm2-runtime server.js"
  }
...
  
 // gulpfile (in root folder i.e. outside /backend)
...
function moveToServer(cb) {
  src(['dist/**'])
  .pipe(dest('backend'));
  cb();
}

exports.prep = series(buildAssetsAndSaveToDistFolder, moveToServer);
...
  

Это хорошо работает локально, поэтому я просто делаю из корневой папки npm start , и gulp создает ресурсы, перемещает их в серверную папку, и сервер запускается. Я могу получить к нему доступ с помощью localhost, и все хорошо. Однако я пытаюсь сделать то же самое в DO droplet, и я вижу в основном то же поведение, за исключением того, что содержимое backend/assets/ папки всегда не загружается и выдает ошибку 404. Это довольно странно, потому что содержимое backend/images папки загружается без проблем, но я проверил и перепроверил, и действительно есть файлы backend/assets , но они просто не загружаются. Чтобы было ясно, запрос, подобный http://example.com/images/logo.png успешному, но http://example.com/assets/css/styles.css выдает 404 Not Found .

Есть идеи? Спасибо!

Комментарии:

1. Я пока не уверен, но похоже, что это как-то связано с вложенными папками

2. Я предполагаю, что у него есть что-то с привилегиями обхода каталога… то, как вы пытаетесь его использовать, любой сможет получить доступ к вашим каталогам. Я предлагаю, если вы хотите, чтобы этот файл был доступен для API, указать маршрут до папки css

3. Не слишком уверен, что вы имеете в виду, можете ли вы опубликовать ответ со своим предложением?

Ответ №1:

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

Проблема была в моей конфигурации nginx. Я использовал конфигурацию обратного прокси по умолчанию, которую Digital Ocean настроил для меня.

 # Default server configuration
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name hellonode;

        location ^~ /assets/ {
               gzip_static on;
               expires 12h;
               add_header Cache-Control public;
        }

        location / {
                proxy_http_version 1.1;
                proxy_cache_bypass $http_upgrade;

                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;

                proxy_pass http://localhost:3000;
        }
}
  

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