Javascript 使用Promissions从DynamoDB异步检索数据

Javascript 使用Promissions从DynamoDB异步检索数据,javascript,node.js,promise,amazon-dynamodb,jestjs,Javascript,Node.js,Promise,Amazon Dynamodb,Jestjs,遵循以下文件: 我正试图针对我的DynamoDB表编写一个基本测试,使用承诺来处理异步响应,但迄今为止运气不佳。它应该返回一个包含表名的对象 如果我访问DynamoDB对象而不使用承诺,我就没有问题 这项工作: import AWS from 'aws-sdk' AWS.config.loadFromPath('./awsConfig.json') const dynamo = new AWS.DynamoDB({region: 'us-east-2'}) window.test('Tes

遵循以下文件:

我正试图针对我的DynamoDB表编写一个基本测试,使用承诺来处理异步响应,但迄今为止运气不佳。它应该返回一个包含表名的对象

如果我访问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
。在处理承诺时,必须将承诺返回到
测试
,以进行适当评估。否则,无法对其进行评估

工作代码:

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)
  })
})
更多信息:

感谢@Brahma Dev的帮助。

Probem和测试代码,而不是承诺 问题不在于dynamoDB或promises,而在于我对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)
  })
})
更多信息:

感谢@Brahma Dev的帮助

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

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