将AWS DynamoDB JS调用从v2升级到v3时遇语法错误求助
解决DynamoDB v3升级的SyntaxError及查询问题
错误根源
你遇到的SyntaxError: Cannot use import statement outside a module是因为混合使用了ES6模块的import和CommonJS的require,Node.js默认将.js文件视为CommonJS模块,不允许直接使用import语法。此外你的代码还存在v2和v3 SDK混用、v3 API调用方式错误的问题。
分步修复方案
1. 统一模块系统,清理冗余代码
删除所有import语句,全部改用CommonJS的require;同时移除v2版本的AWS SDK导入(const AWS = require('aws-sdk')),v3不需要这个。
2. 正确配置v3客户端
v3的客户端配置直接在创建DynamoDBClient实例时传入,不需要像v2那样调用AWS.config.update。另外推荐使用DynamoDBDocumentClient,它能自动处理DynamoDB原生类型(如数字、字符串)和JS类型的转换,不用手动写N:"4"这种格式。
3. 使用v3的命令式API
v3不再支持v2的回调式调用(如docClient.get(params, callback)),而是通过创建GetCommand对象,再用客户端的send方法执行,返回Promise,推荐用async/await处理异步逻辑。
修正后的完整代码
// 仅导入v3需要的模块 const { DynamoDBClient } = require("@aws-sdk/client-dynamodb"); const { DynamoDBDocumentClient, GetCommand } = require("@aws-sdk/lib-dynamodb"); // 配置客户端 const client = new DynamoDBClient({ region: "us-west-2", credentials: { accessKeyId: "*insert keyID*", secretAccessKey: "*insert secret key*" } }); // 创建DocumentClient,自动处理类型转换 const docClient = DynamoDBDocumentClient.from(client); // 用async/await实现查询逻辑 async function fetchOneByKey() { try { const params = { TableName: "scout", Key: { "2637": 4 // 直接用JS数字类型,DocumentClient会自动转为DynamoDB的N类型 }, ProjectionExpression: "auto_docked" }; const response = await docClient.send(new GetCommand(params)); console.log("查询结果:", JSON.stringify(response.Item, null, 2)); } catch (err) { console.error("查询出错:", JSON.stringify(err, null, 2)); } } // 执行查询 fetchOneByKey();
关键说明
- 模块统一:全部用
require符合Node.js默认的CommonJS模块规则,避免模块系统冲突。 - DocumentClient:简化了类型处理,不用手动指定
N/S等DynamoDB数据类型。 - 命令式API:v3的SDK采用命令对象模式,每个操作对应一个Command(如
GetCommand、PutCommand),通过send方法执行,异步逻辑用async/await更清晰。 - 配置方式:v3将配置直接传入客户端实例,不再依赖全局配置,更符合模块化设计。
内容的提问来源于stack exchange,提问作者Lisa Chen
相关产品推荐
相关产品推荐

