Обслуживание универсального приложения angular с серверной частью NodeJS / ExpressJS

У меня есть серверная часть Node / Express JS, развернутая на экземпляре AWS, я использую образ Linux, а веб-сервер, который я использую, - это NGINX. Приложение MEAN работает в настоящее время, поскольку я создаю приложение Angular и копирую папку dist в серверную часть Node / Express JS и направляю серверную часть для обслуживания index.html, это работает нормально, это выглядит примерно так.

Node/Express JS

let pathToClientApp = '/dist';
...
app.use(express.static(path.join(__dirname, pathToClientApp)));
...
app.get('/*', function(req, res, next) {
 if (req.header('Content-Type') == 'application/json') {
  next();
 } else { 
  res.status(200).sendFile(__dirname + 
 `${pathToClientApp}/index.html`);
 }});

Run server on port 3000

Теперь я хотел бы реализовать рендеринг на стороне сервера для приложения Angular. Я добился этого, подписавшись на официальный wiki Angular.

Теперь я могу собрать пакет сервера и протестировать его локально, сначала я запускаю сборку и обслуживаю универсальное приложение Angular, используя следующие команды

npm run build:universal
npm run serve:universal

It runs on port 3000
Node server listening on http://localhost:3000

Обратите внимание, что универсальный Angular также имеет свой собственный сервер Express в этом случае server.ts, он отличается от моего внутреннего JS-сервера Node / Express server.js, который изображен в первом блоке кода.

Итак, после объединения и обслуживания приложения Angular я запускаю внутренний сервер, который затем ссылается на index.html из папки dist, я открываю браузер, и универсальный angular визуализируется очень быстро, он соответственно связывается с серверной частью , Так что он отлично работает в разработке локально.

Итак, для производства, как я могу этого добиться, потому что, когда я просто копирую папку dist на производственный сервер, мне все равно придется запускать универсальный сервер Angular, что я сделал, скопировав также package.json приложения Angular в папку dist, которая у меня есть включенный в производственный сервер, сначала установил node_modules, построил и обслужил, и он работал на порту 3000, а также запустил внутренний сервер на порту 300, но когда я открыл браузер, я получил ошибку в браузере.

Error: Failed to lookup view "/rello-server/dist/dist/browser/index.html" in views directory "/rello-server/dist/dist/browser"
at Function.render (/rello-server/dist/server.js:162542:17) [<root>]
at ServerResponse.render (/rello-server/dist/server.js:167454:7) [<root>]
at /rello-server/dist/server.js:153404:9 [<root>]
at Layer.handle [as handle_request] (/rello-server/dist/server.js:106025:5) [<root>]
at next (/rello-server/dist/server.js:105844:13) [<root>]
at Route.dispatch (/rello-server/dist/server.js:105819:3) [<root>]
at Layer.handle [as handle_request] (/rello-server/dist/server.js:106025:5) [<root>]
at /rello-server/dist/server.js:105319:22 [<root>]
at param (/rello-server/dist/server.js:105392:14) [<root>]
at param (/rello-server/dist/server.js:105403:14) [<root>]
at Function.process_params (/rello-server/dist/server.js:105448:3) [<root>]
at next (/rello-server/dist/server.js:105313:10) [<root>]
at expressInit (/rello-server/dist/server.js:163109:5) [<root>]
at Layer.handle [as handle_request] (/rello-server/dist/server.js:106025:5) [<root>]

И следующее в журнале внутреннего сервера

Error: Cannot find module '/rello-server/dist/dist/server.js'
at Function.Module._resolveFilename (module.js:536:15)
at Function.Module._load (module.js:466:25)
at Function.Module.runMain (module.js:676:10)
at startup (bootstrap_node.js:187:16)
at bootstrap_node.js:608:3
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] serve:universal: `node dist/server.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the [email protected] serve:universal script.
npm ERR! This is probably not a problem with npm. There is likely 
additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/ubuntu/.npm/_logs/2018-03-29T19_25_28_689Z-
debug.log
ubuntu@ip-:/rello-server/dist$ npm run serve:universal
ubuntu@ip-:/rello-server/dist$ npm run build:ssr
npm ERR! missing script: build:ssr

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/ubuntu/.npm/_logs/2018-03-29T19_27_01_180Z-
debug.log
ubuntu@ip-:/rello-server/dist$ node server

events.js:183
  throw er; // Unhandled 'error' event
  ^
Error: listen EADDRINUSE :::3000
at Object._errnoException (util.js:1024:11) [<root>]
at _exceptionWithHostPort (util.js:1046:20) [<root>]
at Server.setupListenHandle [as _listen2] (net.js:1351:14) [<root>]
at listenInCluster (net.js:1392:12) [<root>]
at Server.listen (net.js:1476:7) [<root>]
at Function.listen (/rello-server/dist/server.js:162580:24) [<root>]
at Object.<anonymous> (/rello-server/dist/server.js:153407:5) [<root>]
at __webpack_require__ (/rello-server/dist/server.js:20:30) [<root>]
at /rello-server/dist/server.js:63:18 [<root>]
at Object.<anonymous> (/rello-server/dist/server.js:66:10) [<root>]
at Module._compile (module.js:635:30) [<root>]
at Object.Module._extensions..js (module.js:646:10) [<root>]
at Module.load (module.js:554:32) [<root>]
at tryModuleLoad (module.js:497:12) [<root>]
ubuntu@ip-:/rello-server/dist$ 
ubuntu@ip-:/rello-server/dist$ node server

Node server listening on http://localhost:3000
Error: Failed to lookup view "/rello-
server/dist/dist/browser/index.html" in views directory "/rello-
server/dist/dist/browser"
at Function.render (/rello-server/dist/server.js:162542:17) [<root>]
at ServerResponse.render (/rello-server/dist/server.js:167454:7) 
[<root>]
at /rello-server/dist/server.js:153404:9 [<root>]
at Layer.handle [as handle_request] (/rello-server/dist/server.js:106025:5) [<root>]
at next (/rello-server/dist/server.js:105844:13) [<root>]
at Route.dispatch (/rello-server/dist/server.js:105819:3) [<root>]
at Layer.handle [as handle_request] (/rello-server/dist/server.js:106025:5) [<root>]

Как связать универсальное приложение Angular с внутренним сервером? Любые предложения, ссылки на ресурсы помогут, так как я потратил неделю на исследования, но я не могу найти, как это делается, спасибо.


person teebo    schedule 30.03.2018    source источник
comment
Вы нашли способ объединить существующий экспресс-сервер с угловым универсалом?   -  person The.Wolfgang.Grimmer    schedule 01.12.2020


Ответы (1)


использование ng serve не создает html-страницы, вам нужно либо запустить сервер nodejs, либо сервер angular.

person Rahul Somasundaram    schedule 30.03.2018
comment
Ну, я только что запустил только сервер, и он сработал, спасибо за подсказку, но я все еще не уверен, что это способ сделать это - person teebo; 30.03.2018
comment
На местном уровне мы можем сделать это в целях развития, но это не рекомендуется. Запустите nodejs на 127.0.0.1 и запустите angular на локальном адресе. app.listen (127.0.0.1,3000) для сервера nodejs ng --host 192.168.1.1 --port 3000 для angular - person Rahul Somasundaram; 30.03.2018
comment
Тогда как мне это сделать в реальной производственной среде? - person teebo; 30.03.2018
comment
Для производства можно только один. лучше создать и развернуть приложение - person Rahul Somasundaram; 30.03.2018
comment
Я запускаю приложение angular 7 внутри приложения nodejs, и, запустив nodejs, он отлично работает, но как на стороне сервера отобразить приложение, запустив сервер nodejs - person Gaurav Aggarwal; 20.04.2019