Я создаю приложение для онлайн-радио с Expo и RN, где пользователи могут получать уведомления о программе, которая в настоящее время выходит в эфир. Я пытаюсь использовать функцию AWS Lambda, связанную с базой данных DynamoDB, для отправки функций в службу уведомлений Expo Pu sh, и я запускаю эту функцию через 5 минут с Cloudwatch.
Сейчас в этой функции я отправляю уведомление, а в теле сообщения добавляю текущее время и название воспроизводимого в настоящее время. Затем я установил правило Cloudwatch, которое срабатывает каждые 5 минут. После этого я ожидаю получить уведомление, содержащее текущую информацию, проблема в том, что я получаю время и название игры в 5 минут ДО получения уведомления.
Я сомневаюсь, что это задержка traffi c или что-то еще, поскольку Я получаю уведомления каждые 5 минут последовательно, но с информацией за 5 минут до этого. Я пытался создать новое правило с теми же результатами. Я попытался вручную добавить выражение cron в расписание, но все равно получаю тот же результат.
Вот код, который у меня есть в лямбда-функции:
const https = require("https");
const AWS = require("aws-sdk");
const { Expo } = require('expo-server-sdk');
let expo = new Expo();
AWS.config.update({region: "us-east-2"});
let ddb = new AWS.DynamoDB({apiVersion: "2012-08-10"});
let retrieveParams = {
TableName: "playing",
Key: {
"curr": {N: "1"}
},
};
exports.handler = async (event) => {
let dataString = '';
let lastPlaying = "";
let currPlaying = "";
// Gets the latest played item
ddb.getItem(retrieveParams, function(err, data) {
if (err) {
console.log("Error", err);
} else {
lastPlaying = data.Item.title.S;
}
});
// Gets the currently playing title
const response = await new Promise((resolve, reject) => {
const req = https.get("http:serverurlsomethingsomething", function(res) {
res.on('data', chunk => {
dataString += chunk;
});
res.on('end', () => {
resolve({
statusCode: 200,
body: JSON.parse(dataString)
});
});
});
req.on('error', (e) => {
reject({
statusCode: 500,
body: 'Something went wrong!'
});
});
});
currPlaying = response.body.data[0].song;
// Update the ddb if the current title has changed
if (currPlaying !== lastPlaying) {
// Updates the dynamoDB
let newParams = {
TableName: "playing",
Item: {
"curr": {N: "1"},
"title": {S: currPlaying}
}
};
ddb.putItem(newParams, function(err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", data);
};
});
// Create the messages that you want to send to clents
let messages = [];
let somePushTokens = ["MyPhonesToken"]
for (let pushToken of somePushTokens) {
// Each push token looks like ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]
// Check that all your push tokens appear to be valid Expo push tokens
if (!Expo.isExpoPushToken(pushToken)) {
console.error(`Push token ${pushToken} is not a valid Expo push token`);
continue;
}
// Construct a message (see https://docs.expo.io/versions/latest/guides/push-notifications)
messages.push({
to: pushToken,
sound: 'default',
body: `Minutes: ${new Date().getMinutes()} Seconds: ${new Date().getSeconds()} Title: ${currPlaying}`,
})
}
let chunks = expo.chunkPushNotifications(messages);
(async () => {
// Send the chunks to the Expo push notification service. There are
// different strategies you could use. A simple one is to send one chunk at a
// time, which nicely spreads the load out over time:
for (let chunk of chunks) {
try {
await expo.sendPushNotificationsAsync(chunk);
} catch (error) {
console.error(error);
}
}
})();
return "different";
};
return "same";
};
А вот как Правило Cloudwatch выглядит так: ![](https://i.stack.imgur.com/AXxHt.png)
Итак ... есть идеи, в чем может быть проблема? Я что-то упустил?
PD. Да ... Я переместу лог c уведомлений pu sh в отдельный файл, чтобы сохранить код в чистоте.