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