9

在 AWS Lambda/NodeJS 运行时中,我尝试从绝对路径 ( /opt/nodejs/node_modules/puppeteer) 导入。

Source 在本地运行良好,但一旦与 Webpack/serverless-webpack 捆绑并在 AWS Lambda 中运行,require('puppeteer')结果如下:

{"errorMessage":"Cannot find module 'puppeteer'","errorType":"Error","stackTrace":["webpackMissingModule (/var/task/src/render/handler.js:643:89)","/var/task/src/render/handler.js:643:173","next (native)","step (/var/task/src/render/handler.js:608:191)","/var/task/src/render/handler.js:608:361"]}

我检查过:

  • AWS Lambda 层安装在/opt.
  • 路径/opt/nodejs/node_modules/puppeteer确实存在。
  • NODE_PATH正确地包括/opt/nodejs/node_modules
4

4 回答 4

18

save在将您的 zip 上传到 Amazon 之前,您必须安装带有标志的模块:

npm i puppeteer --save
于 2018-12-13T15:24:09.743 回答
9

npm i --save puppeteer导致包太大。(Lambda 最大 50MB。)

因此,相反,puppeteer 安装了npm i --save-dev puppeteer --ignore-scripts. (忽略脚本以防止安装 Chromium。)serverless-webpack必须告知插件忽略其包装中的 puppeteer。(否则 puppeteer 会使包装膨胀。)

puppeteer 模块被放在一个层中(在问题中提到的文件夹结构中),require('puppeteer')现在可以工作了。

于 2018-12-13T23:35:16.057 回答
1

尝试通过强制环境变量 $NODE_PATH 运行您的脚本。如:

NODE_PATH=/opt/nodejs/node_modules /path/to/bin/node your-file.js

出于特定原因,我必须在不影响当前安装的情况下从源代码构建节点版本,并且此解决方法对我有用。

我已经根据以下问题找到了这个解决方案

于 2021-01-31T19:50:03.610 回答
0

如果您使用的是stencil.js,它会给出非常相似的错误。尝试将模板核心版本更新到至少"@stencil/core": "^1.15.0"

在您的 shell 提示符下尝试

npm install -g npm-check-updates
ncu -u
于 2020-07-07T05:08:17.133 回答