Tìm kiếm trang web

typescript - "TypeError: hashConstructor không phải là một constructor", lỗi khi sử dụng "@aws-sdk/signature-v4" trên AWS-Lambda


Tôi đang phát triển một lambda bằng TypeScript sử dụng gói "@aws-sdk/signature-v4" và khi tôi cố gắng chạy lambda đã triển khai trong bảng điều khiển lambda, tôi nhận được lỗi sau:

  "errorType": "TypeError",
  "errorMessage": "hashConstructor is not a constructor",
  "trace": [
    "TypeError: hashConstructor is not a constructor",
    "    at getPayloadHash (/var/task/node_modules/@aws-sdk/signature-v4/dist-cjs/getPayloadHash.js:17:26)",
    "    at SignatureV4.signRequest (/var/task/node_modules/@aws-sdk/signature-v4/dist-cjs/SignatureV4.js:93:71)"
  ]
}

Cho đến nay tôi đã xem xét các vấn đề đã biết của gói này và tôi đã gặp được liên kết này https://github.com/aws/aws-sdk-js-v3/issues/3590 trên Github. Tôi cũng đang sử dụng gói "@aws-crypto/sha256-js" vốn được cho là cung cấp một giải pháp tạm thời, nhưng cho đến nay có vẻ như không có tác dụng gì đối với lỗi này. "esModuleInterop": true đã được thiết lập trong tsconfig.json của tôi vì "@aws-crypto/sha256-js" là một module commonJS. Mọi sự giúp đỡ sẽ được đánh giá cao!

Cách các gói đang được nhập:

import * as crypto from "@aws-crypto/sha256-js";
const { Sha256 } = crypto;

CẬP NHẬT

Tôi đã đăng xuất đối tượng SignatureV4 sau đây

const signer = new SignatureV4({
    credentials: defaultProvider(),
    region: AWS_REGION,
    service: "appsync",
    sha256: Sha256,
  });

và tôi thấy rằng Sha256 đang xuất hiện dưới dạng không xác định. Tôi đang cố gắng tìm hiểu tại sao lại như vậy.

ĐÃ GIẢI QUYẾT

Tôi đã phải thay đổi cách tôi đang nhập các gói, một sai lầm khá ngu ngốc và tôi hy vọng bằng cách đăng điều này, người khác sẽ tránh được việc làm những gì tôi đã làm.

Cách mà đã hiệu quả

import crypto from "@aws-crypto/sha256-js";
const { Sha256 } = crypto;

Cách mà không hiệu quả nằm ở phần đầu của bài viết này.

Câu trả lời #1

Nhập các gói như thế này

import crypto from "@aws-crypto/sha256-js";
const { Sha256 } = crypto;

Và không phải như thế này

import * as crypto from "@aws-crypto/sha256-js";
const { Sha256 } = crypto; 

Bài viết liên quan