如何使用亚马逊DynamoDB JavaScript SDK与承诺



我正在与Amazon DynamoDB和Express合作。

我需要根据AmazonDynamoDB表中的数据呈现一个视图。

当我使用回调API而不是尝试使用promise时,我的代码运行良好。

但我想使用promise,因为为了保持代码的干净,否则我需要从docClient.scan(params)的回调内部调用res.send()

我使用promise的代码如下,我不知道出了什么问题;

async function test(params){
AWS.config.loadFromPath('./awsconfigtest.json');
let docClient = new AWS.DynamoDB.DocumentClient();
await docClient.scan(params).promise();
}

以下是路由文件的内容;

/* GET home page. */
router.get('/', function(req, res, next) {
let scanResults ;
let params = {
TableName: 'dummy'
};
test(params).then((data,err)=>{
console.log(data,err);
data.Items.forEach(function (element, index, array) {
scanResults.push({name: element.name, nodeId: element.nodeId});
console.log(element.name + " (" + typeof element.nodeId + ")");
});
});
console.log(scanResults);
res.render("index",{nodes:scanResults});    
});

主要原因是您的test函数没有返回任何内容-您忘记了return关键字。

但是,我认为最好的做法是不要将async/await语法与Promise solve语法(.then .catch(混合使用。

这是使用async/await:的方法

async function test(params){
AWS.config.loadFromPath('./awsconfigtest.json');
let docClient = new AWS.DynamoDB.DocumentClient();
return await docClient.scan(params).promise(); // !!! You forgot return keyword
}
/* GET home page. */
router.get('/', async function (req, res, next) { // async function
try {
let scanResults;
let params = {
TableName: 'dummy'
};
const data = await test(params); // await for `data`
console.log(data);
data.Items.forEach(function (element, index, array) {
scanResults.push({ name: element.name, nodeId: element.nodeId });
console.log(element.name + " (" + typeof element.nodeId + ")");
});
console.log(scanResults);
res.render("index", { nodes: scanResults });
} catch (err) {
res.status(500).send(err); // handle exception
}
});

我相信您可以从节点util使用promisify

类似这样的东西:

const util = require('util');
async function test(params){
AWS.config.loadFromPath('./awsconfigtest.json');
let docClient = new AWS.DynamoDB.DocumentClient();
const scan = util.promisify(docClient.scan);
await scan(params);
}

promisify函数转换一个将回调作为其最后一个值的函数,并将其转换为promise,promise将拒绝err值,并解析data值(来自类似docClient.scan(params, (err, data) => {})的东西(

try {
const params = {TableName : NOTES_TABLE_NAME};
const notes = await util.promisify((cb) => documentClient.scan(params, cb))();
cb(null, send(200, notes));
}
catch (err){
cb(null, send(500, err.message));
}

为我工作。