Angular SSR 'Failed to lookup view' 生产(Ubuntu,Nginx)

Angular SSR 'Failed to lookup view' on production (Ubuntu, Nginx)

按照官方 Angular 教程使用 Express 服务器设置 SSR: https://angular.io/guide/universal#configure-for-universal

本教程将设置如下路径:

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

这在本地服务器上运行良好。

但是一旦部署在服务器上(由 Nginx 提供支持),就会出现错误:

Error: Failed to lookup view "index" in views directory "/home/user_name/dist/browser" at Function.render (/var/proj_name/server.js:44670:17) at ServerResponse.render (/var/proj_name/server.js:53701:7) at /var/proj_name/server.js:121:9 at Layer.handle [as handle_request] (/var/proj_name/server.js:46582:5) at next (/var/proj_name/server.js:46330:13) at Route.dispatch (/var/proj_name/server.js:46305:3) at Layer.handle [as handle_request] (/var/proj_name/server.js:46582:5) at /var/proj_name/server.js:45805:22 at param (/var/proj_name/server.js:45878:14) at param (/var/proj_name/server.js:45889:14)

如何正确处理此问题,以便应用程序在本地(用于开发)和生产服务器上正常运行?

编辑:

也曾尝试使用 __dirname 代替:

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

但这在本地和生产服务器上都失败了:

Error: Failed to lookup view "index" in views directory "/browser"

编辑2:

我已通过将 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');returns正确输出。但是,当在真实服务器(Ubuntu、Nginx)上 运行 时,它会得到:/home/<user_name>/dist/browser。使用 __dirname 没有帮助。

所以需要一些方法来确保 res.render('index', { req }); 获得正确的资源。

使用下面的一段代码

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

表示视图引擎将在此目录中查找视图:<currentWorkingDirectory>/dist/browser

当前工作目录对应于启动节点进程的目录。

因此,如果您希望您的代码在本地和生产环境中以相同的方式工作(使用 nginx),您需要确保启动节点的目录始终是 dist/browser目录

所以你应该 运行 来自 /var/<project_name>/

的节点(或 pm2)