【问题标题】:node.js and AWS Lambda Function continue function execution after callbacknode.js 和 AWS Lambda 函数在回调后继续执行函数
【发布时间】:2018-05-24 04:04:44
【问题描述】:

我正在尝试使用 lambda 函数来更改数据库,然后发送推送通知。

我不想等待推送通知服务器回复。在推送通知不成功的偶尔情况下,这不是问题。更重要的是功能及时执行。

目前我正在使用以下两个功能。一切都按预期工作,只是似乎没有节省任何时间。即,当没有设备令牌并且不需要推送时,该功能非常快。当需要推送时,它非常慢。这告诉我我在做什么是错误的,该函数仍在等待回调。

我没有过多地使用节点,并且知道尝试使用来自其他语言的异步模型存在风险。只是想知道如何克服这种情况。

数据库插入函数:

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

推送通知功能:

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

【问题讨论】:

    标签: node.js push-notification callback aws-lambda


    【解决方案1】:

    在 pushParams 中将 InvocationType 的值更改为“Event”,这样调用 lambda 就不会等待响应。它只会调用 lambda 并返回回调。

    示例:

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

    【讨论】:

    • 谢谢。这绝对解决了这个问题。不幸的是,现在通知有时会不同步,并在将来调用该函数后发送。
    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多