如何在 Nodejs 中为 DynamoDB PartiQL 指定参数

问题描述

我想在 NodeJs 中使用 PartiQL 在 DynamoDb 上执行 SELECT 查询,并出现错误

一个简单的语句没有问题。

    const r = await client.send(
      new ExecuteStatementCommand({
          Statement: `SELECT * FROM Users WHERE userId in ['abcd1234']`
      })
    )

但是当尝试执行带有参数的语句时,出现错误

代码

    const r2 = await client.send(
      new ExecuteStatementCommand({
          Statement: `SELECT * FROM Users WHERE userId in ?`,Parameters: [
            ['abcd1234']
          ]
      })
    )

错误

{
  "errorType": "ValidationException","errorMessage": "1 validation error detected: Value '[]' at 'parameters' Failed to satisfy constraint: Member must have length greater than or equal to 1","trace": [
    "ValidationException: 1 validation error detected: Value '[]' at 'parameters' Failed to satisfy constraint: Member must have length greater than or equal to 1","    at deserializeAws_json1_0ExecuteStatementCommandError (/var/task/node_modules/@aws-sdk/client-dynamodb/dist/cjs/protocols/Aws_json1_0.js:2202:41)","    at processticksAndRejections (internal/process/task_queues.js:97:5)","    at async /var/task/node_modules/@aws-sdk/middleware-serde/dist/cjs/deserializerMiddleware.js:6:20","    at async /var/task/node_modules/@aws-sdk/middleware-signing/dist/cjs/middleware.js:12:24","    at async StandardRetryStrategy.retry (/var/task/node_modules/@aws-sdk/middleware-retry/dist/cjs/defaultStrategy.js:56:46)","    at async /var/task/node_modules/@aws-sdk/middleware-logger/dist/cjs/loggerMiddleware.js:6:22","    at async /var/task/node_modules/@aws-sdk/lib-dynamodb/dist/cjs/commands/ExecuteStatementCommand.js:29:26","    at async Runtime.handler (/var/task/save.js:39:16)"
  ]
}

有人有任何解决方案吗?

这是完整的代码


  const client = DynamoDBDocumentClient.from(
    new DynamoDBClient({})
  );

    // this works
    const r = await client.send(
      new ExecuteStatementCommand({
          Statement: `SELECT * FROM Users WHERE userId in ['abcd1234']`
      })
    )

    // this gets an error
    const r2 = await client.send(
      new ExecuteStatementCommand({
          Statement: `SELECT * FROM Users WHERE userId in ?`,Parameters: [
            ['abcd1234']
          ]
      })
    )

解决方法

// Before
SELECT * FROM Users WHERE userId in ?

// After
SELECT * FROM Users WHERE userId in '?'

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...