Javascript 使用Promissions从DynamoDB异步检索数据
遵循以下文件: 我正试图针对我的DynamoDB表编写一个基本测试,使用承诺来处理异步响应,但迄今为止运气不佳。它应该返回一个包含表名的对象 如果我访问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
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。然后((数据)=>{
似乎已解决。您仍然需要移动窗口。期望实际测试时将
插入然后
。您绝对正确。复制+粘贴错误。我将进行更正。