我正在与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));
}
为我工作。