Node Express 服务器未使用 aws lambda 为 angular 应用呈现静态内容
Node express server not rendering static content using aws lambda for angular app
我最近正尝试在 AWS lambda 上部署 angular 应用程序,但我的静态内容出现异常 403。我正在使用 express js 配置服务器。请访问并检查我遇到此问题的 [AWS lambda URL] https://www.mypleaks.com。
这是 server.ts 文件
import 'zone.js/dist/zone-node';
import { join } from 'path';
import * as express from 'express';
import { AppServerModule } from './src/main.server';
import { APP_BASE_HREF } from '@angular/common';
import { ngExpressEngine } from '@nguniversal/express-engine';
import { existsSync } from 'fs';
// Express server
export const app = express();
const PORT = process.env.PORT || 4000;
const DIST_FOLDER = join(process.cwd(), 'dist/myPleaks/browser');
const indexHtml = existsSync(join(DIST_FOLDER, 'index.original.html')) ? 'index.original.html' : 'index';
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
app.engine('html', ngExpressEngine({
bootstrap: AppServerModule,
}));
app.set('view engine', 'html');
app.set('views', DIST_FOLDER);
// Example Express Rest API endpoints
// app.get('/api/**', (req, res) => { });
// Serve 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(indexHtml, { req, providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }] });
});
这里 lambda.js
const awsServerlessExpress = require('aws-serverless-express');
const server = require('./dist/myPleaks/server/main');
const awsServerlessExpressMiddleware = require('aws-serverless-express/middleware');
const binaryMimeTypes = [
'application/javascript',
'application/json',
'application/octet-stream',
'application/xml',
'image/jpeg',
'image/png',
'image/gif',
'text/comma-separated-values',
'text/css',
'text/html',
'text/javascript',
'text/plain',
'text/text',
'text/xml',
'image/x-icon',
'image/svg+xml',
'application/x-font-ttf',
'font/ttf',
'font/otf',
];
server.app.use(awsServerlessExpressMiddleware.eventContext());
const serverProxy = awsServerlessExpress.createServer(server.app, null, binaryMimeTypes);
module.exports.handler = (event, context) => { awsServerlessExpress.proxy(serverProxy, event, context) }
这里 serverless.yml
service: mypleaks # Name whatever as you like!
plugins:
- serverless-apigw-binary
- serverless-offline
provider:
name: aws
runtime: nodejs10.x
memorySize: 192
timeout: 10
stage: production
region: ap-south-1
package:
exclude:
- src/**
- node_modules/**
- firebug-lite/**
- e2e/**
- coverage/**
- '!node_modules/aws-serverless-express/**'
- '!node_modules/binary-case/**'
- '!node_modules/type-is/**'
- '!node_modules/media-typer/**'
- '!node_modules/mime-types/**'
- '!node_modules/mime-db/**'
custom:
contentCompression: 1024
apigwBinary:
types:
- '*/*'
functions:
api:
handler: lambda.handler
events:
- http: ANY /
提前致谢。
我认为您的问题与您的 serverless.yml
有关。这真的很令人沮丧,因为我在无服务器文档中找不到任何地方可以指向你,但我认为你的问题是你告诉 Lambda 只响应一个特定的路由,/
。
如果您加载的资源 directly in the browser 出现 403,您会看到错误:
{"message":"Missing Authentication Token"}
谷歌搜索该消息显示它是一个特定于 lambda 的错误。
查看 this example I found 他们正在添加另一个 http 事件以接受所有路径的请求:
- http:
path: /{any+} # this matches any path, the token 'any' doesn't mean anything special
method: ANY
我最近正尝试在 AWS lambda 上部署 angular 应用程序,但我的静态内容出现异常 403。我正在使用 express js 配置服务器。请访问并检查我遇到此问题的 [AWS lambda URL] https://www.mypleaks.com。
这是 server.ts 文件
import 'zone.js/dist/zone-node';
import { join } from 'path';
import * as express from 'express';
import { AppServerModule } from './src/main.server';
import { APP_BASE_HREF } from '@angular/common';
import { ngExpressEngine } from '@nguniversal/express-engine';
import { existsSync } from 'fs';
// Express server
export const app = express();
const PORT = process.env.PORT || 4000;
const DIST_FOLDER = join(process.cwd(), 'dist/myPleaks/browser');
const indexHtml = existsSync(join(DIST_FOLDER, 'index.original.html')) ? 'index.original.html' : 'index';
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
app.engine('html', ngExpressEngine({
bootstrap: AppServerModule,
}));
app.set('view engine', 'html');
app.set('views', DIST_FOLDER);
// Example Express Rest API endpoints
// app.get('/api/**', (req, res) => { });
// Serve 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(indexHtml, { req, providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }] });
});
这里 lambda.js
const awsServerlessExpress = require('aws-serverless-express');
const server = require('./dist/myPleaks/server/main');
const awsServerlessExpressMiddleware = require('aws-serverless-express/middleware');
const binaryMimeTypes = [
'application/javascript',
'application/json',
'application/octet-stream',
'application/xml',
'image/jpeg',
'image/png',
'image/gif',
'text/comma-separated-values',
'text/css',
'text/html',
'text/javascript',
'text/plain',
'text/text',
'text/xml',
'image/x-icon',
'image/svg+xml',
'application/x-font-ttf',
'font/ttf',
'font/otf',
];
server.app.use(awsServerlessExpressMiddleware.eventContext());
const serverProxy = awsServerlessExpress.createServer(server.app, null, binaryMimeTypes);
module.exports.handler = (event, context) => { awsServerlessExpress.proxy(serverProxy, event, context) }
这里 serverless.yml
service: mypleaks # Name whatever as you like!
plugins:
- serverless-apigw-binary
- serverless-offline
provider:
name: aws
runtime: nodejs10.x
memorySize: 192
timeout: 10
stage: production
region: ap-south-1
package:
exclude:
- src/**
- node_modules/**
- firebug-lite/**
- e2e/**
- coverage/**
- '!node_modules/aws-serverless-express/**'
- '!node_modules/binary-case/**'
- '!node_modules/type-is/**'
- '!node_modules/media-typer/**'
- '!node_modules/mime-types/**'
- '!node_modules/mime-db/**'
custom:
contentCompression: 1024
apigwBinary:
types:
- '*/*'
functions:
api:
handler: lambda.handler
events:
- http: ANY /
提前致谢。
我认为您的问题与您的 serverless.yml
有关。这真的很令人沮丧,因为我在无服务器文档中找不到任何地方可以指向你,但我认为你的问题是你告诉 Lambda 只响应一个特定的路由,/
。
如果您加载的资源 directly in the browser 出现 403,您会看到错误:
{"message":"Missing Authentication Token"}
谷歌搜索该消息显示它是一个特定于 lambda 的错误。
查看 this example I found 他们正在添加另一个 http 事件以接受所有路径的请求:
- http:
path: /{any+} # this matches any path, the token 'any' doesn't mean anything special
method: ANY