Angular Universal(SSR)错误:无法在视图目录中查找视图“索引”

时间:2019-02-02 16:20:03

标签: angular amazon-elastic-beanstalk angular-universal

我想在aws上部署我的通用应用程序。

据我了解,我只能在弹性beantalk上部署我的应用程序,因为它需要运行Web服务器。 (这意味着没有S3部署。)

部署应用程序时,出现以下错误:

  

错误:无法在视图目录中查找视图“索引”   “ / var / app /当前/ dist /浏览器”       在Function.render(/var/app/current/server.js:122227:17)       在ServerResponse.render(/var/app/current/server.js:131120:7)       在/var/app/current/server.js:138:9       在Layer.handle [作为handle_request](/var/app/current/server.js:124007:5)       在下一个(/var/app/current/server.js:123755:13)       在Route.dispatch(/var/app/current/server.js:123730:3)       在Layer.handle [作为handle_request](/var/app/current/server.js:124007:5)       在/var/app/current/server.js:123230:22       在param(/var/app/current/server.js:123303:14)       在param(/var/app/current/server.js:123314:14)

这是我到目前为止所做的:

  1. 在我的有角项目中,使用命令npm run build:ssr
  2. 创建生产版本
  3. 创建我的dist目录
  4. 的存档
  5. 在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}`);
});

我在做什么错了?

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

使用dist文件夹代替dist文件夹的内容作为存档。

在弹性beantalk配置中设置以下“节点命令”设置。

node dist/server

这应该允许您使用标准的Angular开箱即用设置在本地和AWS EB上运行。

答案 1 :(得分:2)

同时,我找到了可在Elastic Beanstalk上部署的解决方案。

按照我执行的不同步骤进行操作

  1. 在您的 Elastic Beanstalk应用程序中,通过将Software Configuration Software Configuration
  2. 更改为Node命令来编辑node dist/server.js
  3. 编辑nodejs使用的端口(2个选项):

    a。您只需通过 8081 编辑server.ts文件中的端口(对应于nginx默认配置中使用的nodejs端口)

    const PORT = process.env.PORT || 8081;
    

    b。 ,您可以使用configuration file .ebextensions编辑nginx配置,以匹配您的角度通用应用中使用的端口(默认为4000)

答案 2 :(得分:1)

代替:

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

上面的行是从 nginx aws目录中的根目录引用我的项目的路径(构建路径)。

如果不起作用,只需控制台CWD:

console.log('processPath',process.cwd());

就我而言,它返回 / 只要, 所以完整的路径就像 / root / www / prod / myProject / dist / browser, 这是('/'+'root / www / prod / myProject / dist / browser') 对于上面的示例。

是的,这也是正确的nginx根目录,它与本地目录不同,即它在本地可以正常工作,并且在部署后在服务器上提供错误消息。

花了几天时间才解决此问题,希望对您有所帮助。
主要问题很简单:无法在特定位置或目录中获取索引文件。
#LearningNeverEnds