如何使用NodeJS PartiQL将含转义字符串的对象存入DynamoDB?
使用Node.js PartiQL将带嵌套字符串对象的数据存入DynamoDB的解决方法
问题原因
你遇到的报错是因为body字段的字符串值包含单引号,直接拼入PartiQL语句时,这些单引号会和语句本身的字符串边界引号冲突,导致语法解析失败。
解决方法
方法1:手动转义字符串中的单引号
在PartiQL语法中,字符串内部的单引号需要用两个连续单引号来转义。你可以先对body的字符串值做替换处理,再拼入语句:
const AWS = require('aws-sdk'); const dynamodb = new AWS.DynamoDB(); const sourceData = { id:'xxyyzz', body:'{\'key1\':\'value1\',\'key2\':\'value2\'}' }; // 将body中的每个单引号替换为两个单引号 const escapedBody = sourceData.body.replace(/'/g, "''"); // 构建PartiQL语句 const statement = `INSERT INTO "YourTableName" VALUE {'id': '${sourceData.id}', 'body': '${escapedBody}'}`; // 执行语句 dynamodb.executeStatement({ Statement: statement }, (err, result) => { if (err) console.error(err); else console.log('数据保存成功', result); });
方法2:使用参数化查询(推荐)
直接拼接字符串容易引发转义问题和注入风险,推荐用PartiQL的参数绑定功能,让SDK自动处理转义:
const AWS = require('aws-sdk'); const dynamodb = new AWS.DynamoDB(); const sourceData = { id:'xxyyzz', body:'{\'key1\':\'value1\',\'key2\':\'value2\'}' }; // 带占位符的PartiQL语句 const statement = `INSERT INTO "YourTableName" VALUE {'id': ?, 'body': ?}`; // 定义参数,按占位符顺序传入,指定数据类型为字符串(S) const params = { Statement: statement, Parameters: [ { S: sourceData.id }, { S: sourceData.body } ] }; // 执行参数化查询 dynamodb.executeStatement(params, (err, result) => { if (err) console.error(err); else console.log('数据保存成功', result); });
参数化查询不仅能彻底解决转义问题,还能避免潜在的注入攻击,代码可读性也更强。
内容的提问来源于stack exchange,提问作者Maor agai
相关产品推荐
相关产品推荐

