【问题标题】:Cannot find module:'@algolia/cache-common'"找不到模块:'@algolia/cache-common'"
【发布时间】:2022-01-04 17:15:19
【问题描述】:

注意 (tl:dr):一切都在本地工作,但在 lambda 中不行。

我在 AWS 中有一个 lambda 函数,当我在本地运行服务器时,一切正常,algolia 的使用是在服务内部进行的,该服务位于我服务器内部的端点中。 我尝试安装 @algolia/cache-common 也没有帮助。 由于这个错误,对 lambda 的每次调用都会导致整个应用程序崩溃。 有什么办法可以解决吗? 错误如下:

    "errorType": "Runtime.ImportModuleError",
    "errorMessage": "Error: Cannot find module '@algolia/cache-common'
    Require stack:
    /opt/nodejs/node_modules/algoliasearch/dist/algoliasearch.cjs.js
    /opt/nodejs/node_modules/algoliasearch/index.js
    /var/task/dist/api/v1/services/algolia.service.js 
    /var/task/dist/api/v1/handlers/jobs.handler.js
    /var/task/dist/api/v1/controllers/jobs.controller.js
    /var/task/dist/api/v1/v1.routes.js
    /var/task/dist/api/routes.js
    /var/task/dist/serverless.js
    /var/runtime/UserFunction.js
    /var/runtime/index.js",
    "stack": [
        "Runtime.ImportModuleError: Error: Cannot find module '@algolia/cache-common'",
        "Require stack:",
        "- /opt/nodejs/node_modules/algoliasearch/dist/algoliasearch.cjs.js",
        "- /opt/nodejs/node_modules/algoliasearch/index.js",
        "- /var/task/dist/api/v1/services/algolia.service.js",
        "- /var/task/dist/api/v1/handlers/jobs.handler.js",
        "- /var/task/dist/api/v1/controllers/jobs.controller.js",
        "- /var/task/dist/api/v1/v1.routes.js",
        "- /var/task/dist/api/routes.js",
        "- /var/task/dist/serverless.js",
        "- /var/runtime/UserFunction.js",
        "- /var/runtime/index.js",
        "    at _loadUserApp (/var/runtime/UserFunction.js:202:13)",
        "    at Object.module.exports.load (/var/runtime/UserFunction.js:242:17)",
        "    at Object.<anonymous> (/var/runtime/index.js:43:30)",
        "    at Module._compile (internal/modules/cjs/loader.js:1085:14)",
        "    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)",
        "    at Module.load (internal/modules/cjs/loader.js:950:32)",
        "    at Function.Module._load (internal/modules/cjs/loader.js:790:12)",
        "    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)",
        "    at internal/main/run_main_module.js:17:47"
    ] 

我使用 algolia 的方式如下:

const applicationId: any = config.get("ALGOLIA.APPLICATION_ID");
const apiKey: any = config.get("ALGOLIA.ADMIN_API_KEY");
const client = algoliasearch(applicationId, apiKey);
const index = client.initIndex("my-actual-index"); 

我的 lambda 结构是一个 lambda 和 3 个模块层,它适用于我使用的每个库,但不适用于 algolia。当我看 lambda 的包时,我可以看到与 algolia 相关的包

我尝试安装确切的包(@algolia/cache-common)但它没有做任何事情, 还尝试了 instally @types/algolia,但效果不佳。

有什么我错过的吗?

【问题讨论】:

    标签: javascript npm aws-lambda node-modules algolia


    【解决方案1】:

    这已解决,问题是我拆分为层,并跳过循环中的第一个索引。

    【讨论】:

    • 感谢您接受我的回答。但是接受你自己的答案绝对没问题。这是允许的。因此,如果可以,请将接受的答案更改为此答案;)
    • @Jens 我标记了你的,因为它让我发现了问题。我没有正确部署 node_modules。
    【解决方案2】:

    当您“安装”诸如 @algolia/cache-common 之类的依赖项时,您是在本地安装它们。


    您安装的依赖项不会自动在 AWS Lambda 上可用。与您的应用程序代码一样,您的依赖项也需要部署。


    这就是为什么它可以在您的本地机器上运行,但不能在 Lambda 上运行。

    您没有写任何关于如何部署代码的内容。 AWS SAM 或 serverless framework 之类的工具通常不仅负责部署您的应用程序代码,还负责部署它的依赖项。

    所以我想你是手动部署的。这意味着您很可能还必须将 node_modules 文件夹部署到 AWS Lambda。

    您的部署 ZIP 存档应如下所示:

    node_modules/
    index.js
    

    node_modules 文件夹将有很多子文件夹等,显然,您可以拥有多个 .js 文件。但是为了这篇文章的目的,我们把它留在那里。

    【讨论】:

    • 我的模块也部署在整个应用程序中——我使用了很多不是 algolia 的包,我总是通过将它添加到 package.json 来做到这一点——但仅限于 algolia =>它显示上面的错误。
    • 您是否检查过依赖项是否已实际部署?您可能有一个 node_modules 文件夹,但由于某种原因,依赖项仍然缺失。您提供的有关部署等的信息很少,因此很难知道会发生什么。但在此之前,您需要 100% 确定依赖项已实际部署,因为这是最可能导致此错误的原因。
    【解决方案3】:

    了解您是如何构建服务的肯定会有所帮助。您的核心服务中的 Algolia 模块是 lambda 还是其中一层?我对层了解不多,但我很好奇如果所有依赖项都捆绑到服务本身中,您是否有同样的问题?

    【讨论】:

    • 它在其中一层。我无法将它们全部捆绑在一起,因为重量超过了限制,很遗憾。
    猜你喜欢
    • 2017-12-25
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 2020-12-13
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多