AWS DAX Client promise() Error: Request object already used

0

Thank you! for taking time to read this post.

I am new to JS and stuck in a callback issue related to promise() when querying AWS DAX. There is a post (using the .promise() call on a dax-services dynamodb document client returns error: Error: ValidationException: Request object already used) related to this issue but am not able to follow the answer.

I also visited below page but got stuck as the page does not provide a sample for client.send(command) https://www.npmjs.com/package/@aws-sdk/client-dax

I keep getting below error: DaxClientError: ValidationException: Request object already used.

Can you please help correcting below code and with explanation to the solution?

I will truly appreciate your help. I spent an entire day on this but did not make any progress.

const express = require('express');
const AWS = require('aws-sdk');
const AmazonDaxClient = require('amazon-dax-client');

var region = "us-west-2";

AWS.config.update({
  region: region
});

const myendpoint = "daxs://mydax.xxxx.dax-clusters.us-west-2.amazonaws.com";
const dax = new AmazonDaxClient({endpoints: [myendpoint], region: region});

// If using AWS.DynamoDB.DocumentClient ...
const doc = new AWS.DynamoDB.DocumentClient({service: dax});

// Constants
const PORT = 8080;
const HOST = '0.0.0.0';

// App
const app = express();

app.get('/', (req, res) => {
  res.send('Hello World');
});

app.get('/readreview', async (req, res) => {
  
try{

var myresult='empty';
    
var params = {
            TableName: 'test',
            Key:{
                "id": 'p12',
                "key": 'description'
            }
        };

await doc.get(params, function(err, data) {
        if (err) {
            console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
            } else {
              myresult=data;
           console.log("@@@@@@@@@"+data);
        }
    }).promise();

    res.send(myresult);
}

catch (e) {
  console.log(e);
}
});

app.listen(PORT, HOST);
console.log(`Running on http://${HOST}:${PORT}`);
sr73
已提問 2 年前檢視次數 230 次
1 個回答
1

This problem is caused by using both a callback and the .promise() method, like this:

await doc.get(params, function(err, data) {
        if (err) {
            console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
            } else {
              myresult=data;
           console.log("@@@@@@@@@"+data);
        }
    }).promise();

The problem is that every call in the DynamoDB API returns an object of type AWS.Request. The actual HTTP request gets sent only when you call the send() method. But passing a callback implicitly calls send(), and calling promise() implicitly calls it again. You can only call send() once.

The callback has to be turned into a .then() call.

await doc.get(params).promise()
       .then(data=>{
              myresult=data;
        }).catch(err=>{
             console.log(err);
       });
profile pictureAWS
專家
已回答 2 年前

您尚未登入。 登入 去張貼答案。

一個好的回答可以清楚地回答問題並提供建設性的意見回饋,同時有助於提問者的專業成長。

回答問題指南