Угловая SSR «Сбой при просмотре» на производстве (Ubuntu, Nginx) - PullRequest
0 голосов
/ 13 сентября 2018

Следуя официальному руководству Angular по настройке SSR с использованием сервера Express: https://angular.io/guide/universal#configure-for-universal

В этом руководстве будут настроены следующие пути:

...
const DIST_FOLDER = join(process.cwd(), 'dist');
...
app.set('views', join(DIST_FOLDER, 'browser'));

Это хорошо работает на локальномserver.

Однако после развертывания на сервере (на базе Nginx) появляется сообщение об ошибке:

Ошибка: не удалось найти представление "index" в каталоге представлений "/ home / user_name/ dist / browser "в Function.render (/var/proj_name/server.js:44670:17) в ServerResponse.render (/var/proj_name/server.js:53701:7) в /var/proj_name/server.js: 121: 9 в Layer.handle [как handle_request] (/var/proj_name/server.js:46582:5) в следующем (/var/proj_name/server.js:46330:13) в Route.dispatch (/ var /proj_name / server.js: 46305: 3) в Layer.handle [как handle_request] (/var/proj_name/server.js:46582:5) в /var/proj_name/server.js:45805:22 в параметре (/ var/proj_name/server.js:45878:14) в параметре (/var/proj_name/server.js:45889:14)

Как правильно обработать это, чтобы приложение работало правильнолокально (для разработки) и на рабочем сервере?

РЕДАКТИРОВАТЬ:

Также пытались использовать __dirname вместо:

app.get('. ', express.static (join (__dirname, 'browser')));

Но это не удается как локально, так и на рабочем сервере:

Ошибка: не удалось найти представление "index" в каталоге представлений "/ browser"

EDIT2:

Мне удалось выполнить эту работу, переместив browser папка в ~/dist/browser.Но я не хочу, чтобы приложение работало таким образом.

Похоже, код ошибки находится в server.ts :

// All regular routes use the Universal engine
app.get('*', (req, res) => {
  res.render('index', { req });
});

При локальном запускеconst DIST_FOLDER = join(process.cwd(), 'dist'); возвращает правильный вывод.Однако при запуске на реальном сервере (Ubuntu, Nginx) он получает: /home/<user_name>/dist/browser вместо этого.Использование __dirname не помогло.

Поэтому нужен какой-то способ убедиться, что res.render('index', { req }); получает правильный ресурс.

1 Ответ

0 голосов
/ 13 сентября 2018

Используя следующий фрагмент кода

const DIST_FOLDER = join(process.cwd(), 'dist');
app.set('views', join(DIST_FOLDER, 'browser'));

означает, что механизм просмотра будет искать представления в этом каталоге: <currentWorkingDirectory>/dist/browser

Текущий рабочий каталог соответствует каталогу, из которого был запущен процесс узла.

Таким образом, если вы хотите, чтобы ваш код работал одинаково для локальной среды и среды prod (используя nginx), вам нужно убедиться, что каталог, из которого вы запускаете узел, всегда является родительским каталогом каталога dist/browser * 1010. *

Таким образом, вы должны запустить узел (или pm2) из ​​/var/<project_name>/

...