关注使用Express服务器设置SSR的官方Angular教程:https://angular.io/guide/universal#configure-for-universal
本教程将设置如下路径:
...
const DIST_FOLDER = join(process.cwd(), 'dist');
...
app.set('views', join(DIST_FOLDER, 'browser'));
这在本地服务器上运行良好。
但是一旦部署在服务器上(由Nginx提供支持),就会出现错误:
错误:无法在ServerResponse.render的Function.render(/var/proj_name/server.js:44670:17)的视图目录“/ home / user_name / dist / browser”中查找视图“index”(/ var / proj_name / server.js:53701:7)在/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)在Route.dispatch(/var/proj_name/server.js:46305:3)的Layer.handle [as handle_request](/var/proj_name/server.js:46582:5)at 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(join(__ dirname,'browser')));
但是这在本地和生产服务器上都失败了:
错误:无法在视图目录“/ browser”中查找视图“index”
Aaditi:
我已经设法通过将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 });
获得正确的资源。
使用以下代码
const DIST_FOLDER = join(process.cwd(), 'dist');
app.set('views', join(DIST_FOLDER, 'browser'));
表示视图引擎将在此目录中查找视图:<currentWorkingDirectory>/dist/browser
当前工作目录对应于启动节点进程的目录。
因此,如果您希望代码以相同的方式为本地和prod环境(使用nginx)工作,则需要确保从哪个起始节点的目录始终是dist/browser
目录的父目录
所以你应该从/var/<project_name>/
运行node(或pm2)