[英]Using DataMapper to Get Item From DynamoDB Throws Runtime Error
我正在使用 Typescript 來實現 Lambda,它連接到同一區域中的 Dynamo 數據庫表。 當我嘗試掃描或從表中獲取項目時,出現以下錯誤。
對於掃描:
2023-01-04T20:02:56.603Z 1ef44a6b-8b4f-51c5-bd10-164456efc703 錯誤調用錯誤 { "errorType": "TypeError", "errorMessage": "this.client.scan(...).promise 不是函數”,“堆棧”:[“TypeError:this.client.scan(...)。promise 不是函數”,“在 ScanPaginator.getNext(/var/task/node_modules/@aws/dynamodb-query- iterator/build/ScanPaginator.js:17:18)", " at /var/task/node_modules/@aws/dynamodb-query-iterator/build/DynamoDbPaginator.js:60:26" ] }
忘記:
{ “errorType”:“Runtime.UnhandledPromiseRejection”,“errorMessage”:“TypeError:_b.map 不是函數”,“reason”:{ “errorType”:“TypeError”,“errorMessage”:“_b.map 不是函數”函數”,“堆棧”:[“TypeError:_b.map 不是函數”,“在 /var/task/node_modules/@aws-sdk/middleware-user-agent/dist-cjs/user-agent-middleware .js:14:151", " at async /var/task/node_modules/@aws-sdk/middleware-logger/dist-cjs/loggerMiddleware.js:5:22" ] }, "promise": {}, " stack": [ "Runtime.UnhandledPromiseRejection: TypeError: _b.map 不是一個函數", " at process. (file:///var/runtime/index.mjs:1194:17)", " at process.emit (節點:事件:513:28)”,“在發射(節點:內部/進程/承諾:149:20)”,“在processPromiseRejections(節點:內部/進程/承諾:283:27)”,“在進程。 processTicksAndRejections (node:internal/process/task_queues:96:32)" ] }
我在處理程序代碼中使用@aws/dynamodb-data-mapper
中的 DataMapper 和@aws-sdk/client-dynamodb
來讀取 Dynamo DB 表。
下面是我的 DTO 代碼:
@table("Configs")
export class Configs {
@hashKey()
configId!: string;
@attribute()
groupName!: string
}
以下是 Lambda 處理程序代碼:
import {SQSEvent} from "aws-lambda";
import {DynamoDB} from "@aws-sdk/client-dynamodb"
import {DataMapper} from "@aws/dynamodb-data-mapper";
import {Configs} from "./models/Configs";
const client = new DynamoDB({region: "us-east-1"});
const mapper = new DataMapper({client});
export const handler = async (sqsEvent: SQSEvent) => {
console.log(`Event: ${JSON.stringify(sqsEvent, null, 2)}`);
for (let record of sqsEvent.Records) {
let messageBody = record.body;
console.log("MessageBody: " + messageBody);
}
const config = new Configs();
for await (const item of mapper.scan(Configs)) {
console.log('scan result', item);
}
console.log("done scanning");
mapper.get(Object.assign(new Configs(), {id: 'MY_ID'}))
.then(myItem => {
console.log('MyItem from db: ', myItem);
})
.catch(err => {
console.log("Not found");
})
};
下面是我的 tsconfig.json
{
"compilerOptions": {
"experimentalDecorators": true,
"target": "es2020",
"strict": true,
"preserveConstEnums": true,
"outDir": "./dist/lib",
"module": "CommonJS",
"declaration": true,
"declarationDir": "./dist/types",
"sourceMap": false,
"moduleResolution":"node",
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"isolatedModules": true,
"emitDecoratorMetadata": true,
"typeRoots": [
"./node_modules/@types"
]
},
"exclude": [
"./node_modules", "**/*.test.ts"]
}
我在這里做錯了什么? 我在 DataMapper https://awslabs.github.io/dynamodb-data-mapper-js/packages/dynamodb-data-mapper/上參考了此處的文檔,但仍然無法弄清楚我做錯了什么。 非常感謝任何幫助。 提前致謝。
我相信這是因為您正在為 DynamoDB 導入 AWS SDK JS V3:
import {DynamoDB} from "@aws-sdk/client-dynamodb"
而 dynamodb-data-mapper 是為 SDK V2 構建的。 您應該為 DynamoDB 安裝 V2 客戶端:
import DynamoDB = require('aws-sdk/clients/dynamodb');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.