Как использовать Amazon DynamoDB JavaScript SDK с обещанием - PullRequest
0 голосов
/ 24 октября 2019

Я работаю с Amazon DynamoDB и Express.

Мне нужно отобразить представление на основе данных из таблицы Amazon DynamoDB.

Мой код работает нормально, когда я работаю с API обратного вызовавместо того, чтобы пытаться использовать обещание.

Но я хочу использовать обещание, потому что для поддержания чистоты моего кода, в противном случае мне нужно вызвать res.send() изнутри функции обратного вызова docClient.scan(params).

Мой код для работы с обещанием выглядит следующим образом: я не могу понять, что не так;

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});    
});

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Основная причина в том, что ваша test функция ничего не возвращает - вы забыли ключевое слово return.

Но я думаю, что лучше всего не смешивать синтаксис async/await с синтаксисом Promise решить(.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
  }
});
0 голосов
/ 24 октября 2019

Полагаю, вы могли бы использовать promisify с узла util.

Примерно так:

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 преобразует функцию, которая принимает обратный вызов в качестве последнего значенияи преобразует его в обещание, которое отклонит значение err и разрешит значение data (из чего-то вроде docClient.scan(params, (err, data) => {}))

...