node.js и AWS Lambda Function продолжают выполнение функции после обратного вызова - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь использовать лямбда-функцию для изменения базы данных, а затем отправить push-уведомление.

Я не хочу ждать ответа сервера push-уведомлений.В тех случаях, когда push-уведомление не выполняется, это не проблема.Более важно, чтобы функция выполнялась своевременно.

В настоящее время я использую следующие две функции.Все работает, как и ожидалось, за исключением того, что, похоже, нет экономии времени.т. е. когда токен устройства отсутствует, а нажатие не требуется, функция выполняется очень быстро.Когда требуется толчок, он очень медленный.Это говорит мне о том, что я делаю неправильно, и функция все еще ожидает обратного вызова.

Я не слишком много использовал узел и знаю, что существуют опасности при попытке использовать асинхронные модели из других языков.Просто интересно, как преодолеть этот случай.

Функция для вставки базы данных:

const AWS = require('aws-sdk');
var mysql = require('mysql');
var lambda = new AWS.Lambda();

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

    var connection = mysql.createConnection({
        host: "databaseHost",
        user: "databaseUser",
        password: "databasePassword",
        database: "databaseName",
        multipleStatements: true
    });

    var sql = "INSERT INTO someTable SET item_id = ?, item_name = ?"

    var inserts = [event.itemId, event.itemName];

    connection.query(sql, inserts, function (error, results, fields) {
        connection.end();
        // Handle error after the release.
        if (error) {
            callback(error);
        } else {

            if (event.userToken !== null) {

                callback(null, results);

                var pushPayload = { "deviceToken": event.deviceToken };

                var pushParams = {
                    FunctionName: 'sendPushNotification',
                    InvocationType: 'RequestResponse',
                    LogType: 'Tail',
                    Payload: JSON.stringify(pushPayload)
                };

                lambda.invoke(pushParams, function (err, data) {
                    if (err) {
                        context.fail(err);
                    } else {
                        context.succeed(data.Payload);

                    }
                });
            } else {
                //callback(null, results);
                callback(null, results);
            }
        }
    });
};

Функция push-уведомлений:

const AWS = require('aws-sdk');
var ssm = new AWS.SSM({ apiVersion: '2014-11-06' });
var apn = require("apn");

exports.handler = function (event, context) {

    var options = {
        token: {
            key: "key",
            keyId: "keyId",
            teamId: "teamId"
        },
        production: true
    };

    var token = event.deviceToken;

    var apnProvider = new apn.Provider(options);


    var notification = new apn.Notification();

    notification.alert = "message";

    notification.topic = "com.example.Example";

    context.callbackWaitsForEmptyEventLoop = false;
    apnProvider.send(notification, [deviceToken]).then((response) => {
        context.succeed(event);
    });
};

1 Ответ

0 голосов
/ 24 мая 2018

В pushParams измените значение InvocationType на «Событие», чтобы вызывающая лямбда не ожидала ответа.Он просто вызовет лямбду и вернет вам обратный вызов.

пример:

var pushParams = {
                    FunctionName: 'sendPushNotification',
                    InvocationType: 'Event',
                    LogType: 'Tail',
                    Payload: JSON.stringify(pushPayload)
                };
...