【问题标题】:dynamodb.put().promise() not returning the put objectdynamodb.put().promise() 不返回 put 对象
【发布时间】:2020-07-16 18:58:31
【问题描述】:

我正在尝试使用 async/await 与 aws 和 dynamo db 相关的功能。下面是一个如何在异步等待之前放置对象的示例,正​​如您在回调中看到的那样,您可以访问包含放置对象的数据。然而,在使用 async 和 promise 的第二个代码块中,结果是一个空对象,有什么想法吗?

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.03.html

非承诺版本

var docClient = new AWS.DynamoDB.DocumentClient();

var table = "Movies";

var year = 2015;
var title = "The Big New Movie";

var params = {
    TableName:table,
    Item:{
        "year": year,
        "title": title,
        "info":{
            "plot": "Nothing happens at all.",
            "rating": 0
        }
    }
};

console.log("Adding a new item...");
docClient.put(params, function(err, data) {
    if (err) {
        console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
    } else {
        console.log("Added item:", JSON.stringify(data, null, 2));
    }
});

Promise async 版本 - 假设包装函数被标记为异步

var docClient = new AWS.DynamoDB.DocumentClient();

var table = "Movies";

var year = 2015;
var title = "The Big New Movie";

var params = {
    TableName:table,
    Item:{
        "year": year,
        "title": title,
        "info":{
            "plot": "Nothing happens at all.",
            "rating": 0
        }
    }
};
const result: any = await dynamoDb.put(params).promise()
console.log(result) 

【问题讨论】:

  • : any 是什么?
  • 它的打字稿,只是意味着结果可以是任何类型
  • 也许你应该更新标签
  • 你发现错误了吗?
  • 您可能指的是异步示例中的docClient.put,而不是dynamoDb.put?如果是这样,请您改正错误

标签: javascript node.js amazon-web-services amazon-dynamodb aws-sdk-js


【解决方案1】:

根据doc,如果您想要返回某些东西,则必须使用ReturnValues

【讨论】:

  • 嗯,是的,这似乎是有道理的,奇怪的是,无论您是否设置了这个值,非承诺对象似乎在回调中返回完整对象,TBH 我真的不需要响应,但是它困扰着我,行为似乎有所不同,并想确保我没有遗漏任何东西/做任何愚蠢的事情。感谢您查看它,我将此标记为正确答案
  • 我发现即使在创建新项目时也可以使用docClient.update。然后ReturnValues 可以接受ALL_NEW 的值,这将返回您要查找的内容。对于docClient.put,您不能对ReturnValues 使用ALL_NEW 选项。希望这可以帮助其他偶然发现此问题的人。
【解决方案2】:

当你使用 Promise 时,你应该使用 .then() 和 .catch() 处理返回的 Promise 对象。 If you take a look at the documentation,你的请求应该是这样的:

dynamoDb.put(params).promise()
  .then(function(data) {
    console.log(data);
  })
  .catch(function(err) {
    console.log(err);
  });

这也将帮助您查看是否遇到任何错误(与使用 try/catch 包围 await 的想法相同,但语法更清晰)

【讨论】:

  • 大概更清晰的语法是一个见仁见智的问题,不应该影响行为?没有抛出错误,正在数据库中创建对象,但响应是空对象而不是放置对象
  • Yupe 不应该影响行为,但是以正确的方式处理承诺成功/错误并不是一种意见。它成功并且返回的对象是空的,即使使用 .then()?这不可能……
  • 根据aws.amazon.com/blogs/compute/… 这两种方法都是处理承诺成功和错误的“正确”方式。无论如何,我尝试使用 .then().catch() 并且行为是相同的,空响应对象,很奇怪
【解决方案3】:

我试过ReturnValues: 'ALL_OLD' 但在async await 中没有结果。

下面是部分代码:

const answersParams = {
          TableName: ANSWERS_TABLE,
          Item: {
            answersId,
            answers,
            userId,
            quizId,
          },
          ReturnValues: 'ALL_OLD',
        };

        try {
          const createdAnswres = await db.put(answersParams).promise();

          return {
            statusCode: 201,
            body: JSON.stringify(createdAnswres && createdAnswres.Item),
          };
        } catch (error) {
          return {
            statusCode: 500,
            body: 'failed to save user answers',
          };
        }
      }
    

所以我不得不向 db 添加另一个请求:

const createdAnswres = await db.get({
              TableName: ANSWERS_TABLE,
              Key: { answersId },
            })
            .promise();
    

【讨论】:

    猜你喜欢
    • 2019-06-30
    • 2016-08-31
    • 1970-01-01
    • 2015-02-06
    • 2022-01-01
    • 1970-01-01
    • 2018-11-03
    • 2021-05-18
    • 2020-11-28
    相关资源
    最近更新 更多