Я пытаюсь использовать лямбда-функцию для изменения базы данных, а затем отправить 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);
});
};