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)
按照官方 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>/