Angular Universal (SSR) Error: Failed to lookup view "index" in views directory
Angular Universal (SSR) Error: Failed to lookup view "index" in views directory
我想在 aws 上部署我的 angular 通用应用程序。
根据我的理解,我只能将我的应用程序部署到 elastic beanstalk 上,因为它需要一个网络服务器才能 运行。 (这意味着没有 S3 部署)。
当我部署我的应用程序时,出现以下错误:
Error: Failed to lookup view "index" in views directory
"/var/app/current/dist/browser"
at Function.render (/var/app/current/server.js:122227:17)
at ServerResponse.render (/var/app/current/server.js:131120:7)
at /var/app/current/server.js:138:9
at Layer.handle [as handle_request] (/var/app/current/server.js:124007:5)
at next (/var/app/current/server.js:123755:13)
at Route.dispatch (/var/app/current/server.js:123730:3)
at Layer.handle [as handle_request] (/var/app/current/server.js:124007:5)
at /var/app/current/server.js:123230:22
at param (/var/app/current/server.js:123303:14)
at param (/var/app/current/server.js:123314:14)
这是我到目前为止所做的:
- 在我的 angular 项目中,使用命令
npm run build:ssr
创建一个生产版本
- 创建我的 dist 目录的存档
- 在 Elastic Beanstalk 上,使用 node.js 创建一个新应用程序并上传我的存档
还有我的 server.ts
文件:
import 'zone.js/dist/zone-node';
import 'reflect-metadata';
import { enableProdMode } from '@angular/core';
// Express Engine
import { ngExpressEngine } from '@nguniversal/express-engine';
// Import module map for lazy loading
import { provideModuleMap } from '@nguniversal/module-map-ngfactory-loader';
import * as express from 'express';
import { join } from 'path';
// Faster server renders w/ Prod mode (dev mode never needed)
enableProdMode();
// Express server
const app = express();
const PORT = process.env.PORT || 4000;
const DIST_FOLDER = join(process.cwd(), 'dist/browser');
// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist/server/main');
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
app.engine('html', ngExpressEngine({
bootstrap: AppServerModuleNgFactory,
providers: [
provideModuleMap(LAZY_MODULE_MAP)
]
}));
app.set('view engine', 'html');
app.set('views', DIST_FOLDER);
// Example Express Rest API endpoints
// app.get('/api/**', (req, res) => { });
// Server static files from /browser
app.get('*.*', express.static(DIST_FOLDER, {
maxAge: '1y'
}));
// All regular routes use the Universal engine
app.get('*', (req, res) => {
res.render('index', { req });
});
// Start up the Node server
app.listen(PORT, () => {
console.log(`Node Express server listening on http://localhost:${PORT}`);
});
我做错了什么?
感谢您的帮助。
使用 dist
文件夹作为存档,而不是 dist
文件夹的内容。
在您的弹性 beantalk 配置中设置以下 'node command' 设置。
node dist/server
这应该允许您使用标准 Angular 开箱即用设置在本地和 AWS EB 上 运行。
编辑
只是为了提供更多信息,这应该可以解决问题。正如@Kartik Chandra 所指出的,问题出在行server.ts 文件中
const distFolder = join(process.cwd(), 'dist/landing/browser');
在您的 prod env 进程上部署时将查找 dist 文件夹,因此如果您不复制它将会失败。
选项是复制整个 dist 文件夹或更改您的 server.ts,但这会破坏您的本地开发。
同时,我找到了部署在 Elastic Beanstalk 上的解决方案。
下面我做的不同步骤:
- 在您的 Elastic Beanstalk 应用程序 中,通过
node dist/server.js
更改节点命令来编辑 Software Configuration
编辑nodejs使用的端口(2个选项):
一个。您可以通过 8081 简单地编辑 server.ts
文件中的端口(对应于 nginx 默认配置中使用的 nodejs 端口)
const PORT = process.env.PORT || 8081;
b。 或您可以使用 configuration file .ebextensions 编辑您的 nginx 配置以匹配您的 angular 通用应用程序中使用的端口(默认为 4000)
而不是:
const DIST_FOLDER = join(process.cwd(), 'dist/browser');
写入:
const DIST_FOLDER = join(process.cwd(), 'rootpathofServer/dist/browser');
示例:
const DIST_FOLDER = join(process.cwd(), 'root/www/prod/myProject/dist/browser');
root/www/prod/myProject/dist/browser
上面一行是指我项目的路径(build path)从根目录在nginx aws目录.
如果不起作用,只需控制台 CWD:
console.log('processPath',process.cwd());
就我而言 return
/
只要,
所以完整的路径就像
/root/www/prod/myProject/dist/browser,
这是 ('/' + 'root/www/prod/myProject/dist/browser')
对于上面的例子。
是的,nginx 根目录也确实不同于本地,即它在本地工作正常,部署后在服务器上出错。
整理这个问题花了好几天时间,希望对您有所帮助。
主要问题很简单:无法在特定位置或目录获取索引文件。
#LearningNeverEnds
该错误是由于脚本没有为索引文件使用正确的文件夹引起的。 __dirname
是获取相对于 main.js
.
位置的文件路径的更好方法
你可以替换这一行const distFolder = join(process.cwd(), "dist/browser");
和
const distFolder = join(__dirname, "../../dist/browser");
我想在 aws 上部署我的 angular 通用应用程序。
根据我的理解,我只能将我的应用程序部署到 elastic beanstalk 上,因为它需要一个网络服务器才能 运行。 (这意味着没有 S3 部署)。
当我部署我的应用程序时,出现以下错误:
Error: Failed to lookup view "index" in views directory "/var/app/current/dist/browser" at Function.render (/var/app/current/server.js:122227:17) at ServerResponse.render (/var/app/current/server.js:131120:7) at /var/app/current/server.js:138:9 at Layer.handle [as handle_request] (/var/app/current/server.js:124007:5) at next (/var/app/current/server.js:123755:13) at Route.dispatch (/var/app/current/server.js:123730:3) at Layer.handle [as handle_request] (/var/app/current/server.js:124007:5) at /var/app/current/server.js:123230:22 at param (/var/app/current/server.js:123303:14) at param (/var/app/current/server.js:123314:14)
这是我到目前为止所做的:
- 在我的 angular 项目中,使用命令
npm run build:ssr
创建一个生产版本
- 创建我的 dist 目录的存档
- 在 Elastic Beanstalk 上,使用 node.js 创建一个新应用程序并上传我的存档
还有我的 server.ts
文件:
import 'zone.js/dist/zone-node';
import 'reflect-metadata';
import { enableProdMode } from '@angular/core';
// Express Engine
import { ngExpressEngine } from '@nguniversal/express-engine';
// Import module map for lazy loading
import { provideModuleMap } from '@nguniversal/module-map-ngfactory-loader';
import * as express from 'express';
import { join } from 'path';
// Faster server renders w/ Prod mode (dev mode never needed)
enableProdMode();
// Express server
const app = express();
const PORT = process.env.PORT || 4000;
const DIST_FOLDER = join(process.cwd(), 'dist/browser');
// * NOTE :: leave this as require() since this file is built Dynamically from webpack
const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./dist/server/main');
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
app.engine('html', ngExpressEngine({
bootstrap: AppServerModuleNgFactory,
providers: [
provideModuleMap(LAZY_MODULE_MAP)
]
}));
app.set('view engine', 'html');
app.set('views', DIST_FOLDER);
// Example Express Rest API endpoints
// app.get('/api/**', (req, res) => { });
// Server static files from /browser
app.get('*.*', express.static(DIST_FOLDER, {
maxAge: '1y'
}));
// All regular routes use the Universal engine
app.get('*', (req, res) => {
res.render('index', { req });
});
// Start up the Node server
app.listen(PORT, () => {
console.log(`Node Express server listening on http://localhost:${PORT}`);
});
我做错了什么?
感谢您的帮助。
使用 dist
文件夹作为存档,而不是 dist
文件夹的内容。
在您的弹性 beantalk 配置中设置以下 'node command' 设置。
node dist/server
这应该允许您使用标准 Angular 开箱即用设置在本地和 AWS EB 上 运行。
编辑 只是为了提供更多信息,这应该可以解决问题。正如@Kartik Chandra 所指出的,问题出在行server.ts 文件中
const distFolder = join(process.cwd(), 'dist/landing/browser');
在您的 prod env 进程上部署时将查找 dist 文件夹,因此如果您不复制它将会失败。
选项是复制整个 dist 文件夹或更改您的 server.ts,但这会破坏您的本地开发。
同时,我找到了部署在 Elastic Beanstalk 上的解决方案。
下面我做的不同步骤:
- 在您的 Elastic Beanstalk 应用程序 中,通过
node dist/server.js
更改节点命令来编辑 编辑nodejs使用的端口(2个选项):
一个。您可以通过 8081 简单地编辑
server.ts
文件中的端口(对应于 nginx 默认配置中使用的 nodejs 端口)const PORT = process.env.PORT || 8081;
b。 或您可以使用 configuration file .ebextensions 编辑您的 nginx 配置以匹配您的 angular 通用应用程序中使用的端口(默认为 4000)
Software Configuration
而不是:
const DIST_FOLDER = join(process.cwd(), 'dist/browser');
写入:
const DIST_FOLDER = join(process.cwd(), 'rootpathofServer/dist/browser');
示例:
const DIST_FOLDER = join(process.cwd(), 'root/www/prod/myProject/dist/browser');
root/www/prod/myProject/dist/browser
上面一行是指我项目的路径(build path)从根目录在nginx aws目录.
如果不起作用,只需控制台 CWD:
console.log('processPath',process.cwd());
就我而言 return / 只要, 所以完整的路径就像 /root/www/prod/myProject/dist/browser, 这是 ('/' + 'root/www/prod/myProject/dist/browser') 对于上面的例子。
是的,nginx 根目录也确实不同于本地,即它在本地工作正常,部署后在服务器上出错。
整理这个问题花了好几天时间,希望对您有所帮助。
主要问题很简单:无法在特定位置或目录获取索引文件。
#LearningNeverEnds
该错误是由于脚本没有为索引文件使用正确的文件夹引起的。 __dirname
是获取相对于 main.js
.
你可以替换这一行const distFolder = join(process.cwd(), "dist/browser");
和
const distFolder = join(__dirname, "../../dist/browser");