部署到 AWS lambda 时找不到模块 ./dist/server

Posted

技术标签:

【中文标题】部署到 AWS lambda 时找不到模块 ./dist/server【英文标题】:cannot find module ./dist/server when deploying to AWS lambda 【发布时间】:2020-02-17 01:51:03 【问题描述】:

我有一个使用节点 serverless deploy 在 AWS lambda 中运行的简单无服务器网站,然后我向该站点添加了更多内容并更新到最新版本的无服务器,现在当我部署该站点并访问我得到的 URL:

"message": "Internal server error"

当我访问 lambda 控制台时,我得到:


  "errorType": "Runtime.ImportModuleError",
  "errorMessage": "Error: Cannot find module './dist/server'",
  "trace": [
    "Runtime.ImportModuleError: Error: Cannot find module './dist/server'",
    "    at _loadUserApp (/var/runtime/UserFunction.js:100:13)",
    "    at Object.module.exports.load (/var/runtime/UserFunction.js:140:17)",
    "    at Object.<anonymous> (/var/runtime/index.js:45:30)",
    "    at Module._compile (internal/modules/cjs/loader.js:778:30)",
    "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)",
    "    at Module.load (internal/modules/cjs/loader.js:653:32)",
    "    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)",
    "    at Function.Module._load (internal/modules/cjs/loader.js:585:3)",
    "    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)",
    "    at startup (internal/bootstrap/node.js:283:19)"
  ]

知道如何解决这个问题吗?

更多信息

基于下面的@Amit Baranes 评论,其中引用了this SO post,这里是一个 Angular 站点。我不太明白需要更改处理程序名称以匹配我的站点结构。我自己并没有将文件捆绑到 .zip 中,而是通过节点运行 serverless deploy 命令:

这里是网站 serverless.yml

# generated by @ng-toolkit/serverless
service: serverless-site

plugins:
  - serverless-apigw-binary

provider:
  name: aws
  runtime: nodejs10.x
  memorySize: 192
  timeout: 10
  stage: production
  region: us-east-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:
  apigwBinary:
    types:
      - '*/*'

functions:
  api:
    handler: lambda.universal
    events:
      - http: ANY proxy+
      - http: ANY /

这是我的网站项目文件结构(从 src 目录开始)。

这是部署时的网站 lambda 函数:

由于该函数没有 server.js。我试图通过修改 server.ts 并将其放入文件夹中来创建,但没有成功:

// generated by Paul
//import 'zone.js/dist/zone-node';
//import 'reflect-metadata';

var express =require('express');
var cors= require('cors');
var compression =require('compression');

var join=require('path').join;

export const app = express();

app.use(compression());
app.use(cors());

const DIST_FOLDER = join(process.cwd(), 'dist/serverless-site');

app.get('*.*', express.static(join(DIST_FOLDER), 
    maxAge: '1y'
));

app.get('/*', (req, res) => 
    res.sendFile(join(DIST_FOLDER + '/index.html'));
);

【问题讨论】:

检查文件名和处理程序名是否相同***.com/questions/41750026/… @AmitBaranes 知道 Angular 站点的处理程序名称是什么吗? 试试 lambda.js... 试过了,但不幸遇到了同样的错误 抱歉回复晚了,有什么更新吗? 【参考方案1】:

所以看来 server.js 没有在 dist 文件夹中创建。

我通过在serverless deploy 之前运行npm run build:server:prod 让它工作

我的 package.json 中的相关行如下所示:

"build:server:serverless": "webpack --config webpack.server.config.js"

这可能不是正确的方法,但它解决了找不到 ./dist/server 的问题并让我进入下一个错误:


    "errorType": "TypeError",
    "errorMessage": "express is not a function",
    "stack": [
        "TypeError: express is not a function",
        "    at Object.<anonymous> (/var/task/dist/server.js:9231:15)",
        "    at __webpack_require__ (/var/task/dist/server.js:21:30)",
        "    at /var/task/dist/server.js:85:18",
        "    at Object.<anonymous> (/var/task/dist/server.js:88:10)",
        "    at Module._compile (internal/modules/cjs/loader.js:778:30)",
        "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)",
        "    at Module.load (internal/modules/cjs/loader.js:653:32)",
        "    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)",
        "    at Function.Module._load (internal/modules/cjs/loader.js:585:3)",
        "    at Module.require (internal/modules/cjs/loader.js:692:17)"
    ]

感谢AWS Serverless Lambda + Angular - TypeError: express is not a function,我通过在 tsconfig 文件中设置 esModuleInterop = false 修复了 express 错误

【讨论】:

【参考方案2】:

我确实看到您正在使用 ng-toolkit 包来为您的 Angular 应用程序提供通用 + 无服务器。

基于此,我确实认为您收到此类错误是由于最新版本的软件包配置错误,其中包括服务器文件上的一些错误以及与 Angular/Universal 软件包不匹配。

我确实建议同时查看我的示例存储库 Example Angular ng-toolkit,它已经解决了这个问题。

需要指出:这是由 webpack.config 选项 externals 引起的,该选项是在 Angular Universal 包的最新 express-engine 示意图中引入的。评论该行,将解决您的问题。

目前我还不清楚原因,但希望我能就这个话题带来我的发现。

干杯!

【讨论】:

以上是关于部署到 AWS lambda 时找不到模块 ./dist/server的主要内容,如果未能解决你的问题,请参考以下文章

在 Elastic Beanstalk 上部署时找不到模块 Django

错误:部署到 heroku 时找不到模块“webpack”

将 node.js 应用程序部署到谷歌云平台时找不到模块“yargs”错误

尝试为 php pecl 扩展模块 (geoip) 构建 rpm 时找不到 .so

aws-lambda 找不到模块

ImportModuleError aws lambda。找不到模块“./json.js”