【问题标题】:Retrieve Data from DynamoDB asynchronously using Promises使用 Promises 从 DynamoDB 异步检索数据
【发布时间】:2018-04-02 23:15:55
【问题描述】:

按照文档 http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/using-promises.html

我正在尝试使用 Promise 针对我的 DynamoDB 表编写一个基本测试来处理异步响应,但到目前为止还没有成功。它应该返回一个包含 TableNames 的对象。

如果我在不使用 Promise 的情况下访问 DynamoDB 对象,我没有问题。

这行得通:

import AWS from 'aws-sdk'
AWS.config.loadFromPath('./awsConfig.json')

const dynamo = new AWS.DynamoDB({region: 'us-east-2'})

window.test('Test Connection', () => {
  return dynamo.listTables({Limit: 10}, (err, data) => {
    if (err) {
      console.log('err', err)
    } else {
      console.log('TableNames are:', data)
    }
    window.expect(data).toEqual(window.expect.anything())
  })
})

这不是:

import AWS from 'aws-sdk'
AWS.config.loadFromPath('./awsConfig.json')

const dynamo = new AWS.DynamoDB({region: 'us-east-2'})

window.test('Test Connection', () => {
  let tables
  const listPromise = dynamo.listTables({Limit: 10}).promise()
  listPromise.then((data) => {
    tables = data
    console.log('TableNames are:', data)
  }).catch((err) => {
    console.log('Error:', err)
  })
  window.expect(tables).toEqual(window.expect.anything())
})

数据的值总是未定义的。我找不到任何表明 DynamoDB 请求不支持承诺的文档,所以我几乎可以肯定我遗漏了一些明显的东西......

感谢任何帮助。这是我第一次在这个论坛上提问,因此也感谢您对问题本身的反馈。

编辑:问题已解决 - 新手错误 问题不在于 dynamoDB,而在于使用 test。在处理 Promise 时,必须将 Promise 返回到test 以进行正确评估。否则无法评估。

工作代码:

import AWS from 'aws-sdk'
AWS.config.loadFromPath('./awsConfig.json')

const dynamo = new AWS.DynamoDB({region: 'us-east-2'})

window.test('Test Connection', () => {
  const listPromise = dynamo.listTables({Limit: 10}).promise()
  return listPromise.then((data) => {
    window.expect(data).toEqual(window.expect.anything())
  }).catch((err) => {
    console.log('Error:', err)
  })
})

更多信息:https://facebook.github.io/jest/docs/en/asynchronous.html

感谢@Brahma Dev 的帮助。

【问题讨论】:

  • window.expect移动到then内。
  • 感谢您的回复。我有你提议的改变,但行为是一样的。除非我弄错了,否则这无关紧要,因为tables 是在承诺之外定义的,并且在调用window.expect() 时仍应保留数据的值。我还尝试在then 中使用window.expect(data) 而不是window.expect(tables),结果相同(正如人们所期望的那样)。事实证明,这个问题更难解决,因为控制台消息也不起作用......
  • 您正在运行异步代码。 window.expect 将在 dynamodb 返回任何内容之前运行。这就是为什么它需要在then 内。如果 console.log 没有显示任何内容,那么这是一个完全独立的问题。你的程序会立即关闭吗?
  • 感谢您的澄清。这是完全有道理的,我确实认识到控制台问题是另一回事。因此,我认为行为相同的假设是错误的,因为它基于 tables 仍在报告未定义值的事实。事实上,无论我对它设置什么条件,测试现在都会错误地通过。程序不退出或出错。
  • 我相信我可能已经发现了我的问题。我没有正确实现test 的承诺,因为我没有返回承诺。用return listPromise.then((data) => { 替换:listPromise.then((data) => { 似乎已经解决了。

标签: javascript node.js promise amazon-dynamodb jestjs


【解决方案1】:

用测试代码探测,而不是 Promise

问题不在于 dynamoDB 或 Promise,而在于我对 test.xml 的使用。在处理 Promise 时,必须返回 Promise 以测试正确的评估。否则无法正确评估。

工作代码:

import AWS from 'aws-sdk'
AWS.config.loadFromPath('./awsConfig.json')

const dynamo = new AWS.DynamoDB({region: 'us-east-2'})

window.test('Test Connection', () => {
  const listPromise = dynamo.listTables({Limit: 10}).promise()
  return listPromise.then((data) => {
    window.expect(data).toEqual(window.expect.anything())
  }).catch((err) => {
    console.log('Error:', err)
  })
})

更多信息:https://facebook.github.io/jest/docs/en/asynchronous.html

感谢@Brahma Dev 的帮助。

编辑:根据@Brahma Dev 的反馈更正了工作代码示例
此外,删除了一些不必要的变量声明和赋值。

【讨论】:

  • 您仍然需要将window.expect移动到then进行实际测试。
  • 你是绝对正确的。复制+粘贴错误。我会改正的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 2015-07-02
  • 2017-01-11
  • 2015-11-29
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多