跳至內容

如何解決當我在 Node.js 中執行 Lambda 程式碼時,出現的 "Cannot find module" 或 "Cannot find Package" 錯誤訊息?

2 分的閱讀內容
0

當我在 Node.js 中執行 AWS Lambda 程式碼時,收到 "Cannot find module" 或 "Cannot find Package" 錯誤訊息。

簡短說明

如果您的 Lambda 環境在 Node.js 程式碼中找不到指定的程式庫,那麼您會收到上述錯誤訊息。之所以發生這些錯誤,是因為 Lambda 並未預先封裝所有 Node.js 程式庫。

解決方法

若要解決這些錯誤,請建立 Lambda 層,其中包含您要在 Node.js 程式碼中使用的程式庫。您可以在多個 Lambda 函式中重複使用圖層。

對於 Node.js 執行時期 16 及更早版本,Lambda 不支援分層式 JavaScript ES 模組相依性。您必須在部署中包括相依性。Lambda 支援 JavaScript ES 模組相依性 Node.js 24。

每個 Lambda 執行時期會將特定的 /opt 目錄資料夾新增至 PATH 變數。如果該層使用相同的資料夾結構,則 Lambda 函式的程式碼無需特定路徑即可存取層內容。

重要事項: 您為 Node.js 匯入的程式庫必須位於 nodejs/node_modules 資料夾結構內。

最佳做法是在 Lambda 支援的執行時期所依據的相同作業系統 (OS) 上建立 Lambda 層。例如,Node.js 的最新版本是依據 Amazon Linux 2023 Amazon Machine Image (AMI)。

注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱 Troubleshooting errors for the AWS CLI (對 AWS CLI 錯誤進行疑難排解)。此外,請務必使用最新版 AWS CLI。

若要為 Node.js 程式庫建立 Lambda 層,請完成下列步驟:

  1. 從 Amazon Linux 2023 AMI 建立 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。
  2. 建立具有呼叫 publish-layer-version API 許可的 AWS Identity and Access Management (IAM) 角色。
  3. 將 IAM 角色附加至 Amazon EC2 執行個體。

注意: 您的執行個體現在具備許可,能為 publish-layer-version API 呼叫上傳 Lambda 層。 使用 SSH 連線到 EC2 執行個體。 若要安裝 Node.js,請執行下列 curl 命令:

    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh
    bash
    $ . ~/.nvm/nvm.sh
    nvm install 24
    ```

6. 建立 **nodejs** 資料夾:
   ```plaintext
   mkdir nodejs
  1. 將 aws-xray-sdk 程式庫安裝到 nodejs 資料夾中:

    cd nodejs$ npm init  ***answer all queries for initialization that create a package.json file***
    npm install --save aws-xray-sdk

    注意: 請將 aws-xray-sdk 替換為您要匯入的 Node.js 程式庫。

  2. 為 aws-xray-sdk 程式庫建立 .zip 檔案封存:

    zip -r layer.zip nodejs

    注意: aws-xray-sdk 程式庫採用 Node.js 層所需的資料夾格式 nodejs/node_modules。

  3. 若要發佈 Lambda 層,請執行下列 publish-layer-version 命令:

    aws lambda publish-layer-version --layer-name xray --zip-file fileb://layer.zip --compatible-runtimes nodejs24.x --region your-region

    注意: 請將 xray 替換為您的層名稱、將 nodejs24.x 替換為您的 Node.js 版本,並將 your-region 替換為您的 AWS 區域。

若要在程式碼中新增模組 ECMAScript 6 (ES6) 或 CommonJS,請參閱 JavaScript ES6/CommonJS 語法。

相關資訊

如何對上傳 Lambda 部署套件時的「permission denied」或「unable to import module」錯誤進行疑難排解?

如何建置 Node.js 的 Lambda 部署套件?

AWS 官方已更新 7 個月前