#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.