代码之家  ›  专栏  ›  技术社区  ›  alionthego

node.js和aws lambda函数在回调后继续执行函数

  •  0
  • alionthego  · 技术社区  · 6 年前

    我正在尝试使用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);
        });
    };
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   siraj pathan    6 年前

    在PushParams中更改值 调用类型 以使调用lambda不会等待响应。它只调用lambda并返回回调。

    例子:

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