Async Await проблемы с NodeJS & Lamba - PullRequest
1 голос
/ 13 марта 2019

В настоящее время я разрабатываю вызов функции Lamba для своего проекта AWS, но из-за того, что я не являюсь мастером в асинхронных функциях, кажется, что он разваливается, код, который я собрал:

const AWS = require("aws-sdk");
const game = require('game-api');
const uuid = require("uuid");

AWS.config.update({
  region: "us-east-1"
});

exports.handler = async (event, context, callback) => {

    //set db
    var documentClient = new AWS.DynamoDB.DocumentClient()

    //params
    const params = {
        Item: {
            'id': uuid.v1(),
            'player_1_name': null,
            'player_1_network': null,
            'player_1_matches': 0,
            'player_1_kills': 0,
            'player_1_last_updated': 0,
            'player_2_name': null,
            'player_2_network': null,
            'player_2_matches': 0,
            'player_2_kills': 0,
            'player_2_last_updated': 0,
            'match_id': 0,
            'status': 0
        },
        TableName : 'matches'
    };

    var matchData = JSON.parse(event.body);

    //player 1
    const player_1_name = matchData.player_1_name ? matchData.player_1_name : null;
    const player_1_network = matchData.player_1_network ? matchData.player_1_network : null;

    //player 2
    const player_2_name = matchData.player_2_name ? matchData.player_2_name : null;
    const player_2_network = matchData.player_2_network ? matchData.player_2_network : null;

    //match data
    const match_id = matchData.match_id ? matchData.match_id : 0;

    //game object
    let gameAPI = new game(
        [
            "email@email.com",
            "password"
        ]
    );

    //gameAPI.login() returns a Promise()
    await gameAPI.login().then(() => {

        //check stats for player 1, getStats returns a Promise()
        gameAPI.getStats(player_1_name, player_1_network).then(stats => {

            params.Item.player_1_matches = stats.lifetimeStats.matches;
            params.Item.player_1_kills = stats.lifetimeStats.kills;

        }).catch(err => {

            //error! we must work out what to do here!
            console.log(err);

        });

        //example insert
        documentClient.put(params, function(err, data){
            return callback(err, data);
        });

    }).catch(err => {
        console.log("We failed to login!");
        console.log(err);
    });

};

Эта логика кажется ошибочной, поскольку в мои журналы AWS ничего не добавляется?моя идея состоит в том, чтобы отправить запрос в функцию и сделать это как можно быстрее, чтобы я мог отправить ответ 200 обратно в Lambda, кто-нибудь может указать мне правильное направление?

1 Ответ

0 голосов
/ 13 марта 2019

При использовании async/await вам не нужно использовать callback и вам не нужно попадать в Обетованный Ад.

Просто await на ваши обещания и получить результат. Большое преимущество здесь в том, что ваш код выглядит синхронно.

Вот ваш переработанный код:

const AWS = require("aws-sdk");
const game = require('game-api');
const uuid = require("uuid");

AWS.config.update({
  region: "us-east-1"
});

exports.handler = async (event) => {

    //set db
    var documentClient = new AWS.DynamoDB.DocumentClient()

    //params
    const params = {
        Item: {
            'id': uuid.v1(),
            'player_1_name': null,
            'player_1_network': null,
            'player_1_matches': 0,
            'player_1_kills': 0,
            'player_1_last_updated': 0,
            'player_2_name': null,
            'player_2_network': null,
            'player_2_matches': 0,
            'player_2_kills': 0,
            'player_2_last_updated': 0,
            'match_id': 0,
            'status': 0
        },
        TableName : 'matches'
    };

    var matchData = JSON.parse(event.body);

    //player 1
    const player_1_name = matchData.player_1_name ? matchData.player_1_name : null;
    const player_1_network = matchData.player_1_network ? matchData.player_1_network : null;

    //player 2
    const player_2_name = matchData.player_2_name ? matchData.player_2_name : null;
    const player_2_network = matchData.player_2_network ? matchData.player_2_network : null;

    //match data
    const match_id = matchData.match_id ? matchData.match_id : 0;

    //game object
    let gameAPI = new game(
        [
            "email@email.com",
            "password"
        ]
    );

    //gameAPI.login() returns a Promise()
    await gameAPI.login()

    const stats = await gameAPI.getStats(player_1_name, player_1_network)
    params.Item.player_1_matches = stats.lifetimeStats.matches;
    params.Item.player_1_kills = stats.lifetimeStats.kills;

        //example insert
    await documentClient.put(params).promise();

};

Если вам нужно обработать исключения (вы должны), просто оберните ваши ожидающие вызовы в блоки try/catch, например:

try {
   console.log(await somePromise)
} catch (e) {
   console.log(e)
}

Фрагмент выше эквивалентен:

somePromise.then(console.log).catch(console.log)

с той большой разницей, что вам не нужно связывать обещания / асинхронный код, чтобы сохранить порядок выполнения, поэтому я настоятельно рекомендую вам выбрать подход async/await и забыть о .then().catch()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...