Настройка уведомления на будущую дату
Частым случаем использования очередей является планирование выполнения задач на будущее. Чтобы продемонстрировать, как это работает, мы предоставили пример приложения (описанного ниже), которое планирует сообщения уведомлений, отправляемые через API Courier. Приложение работает на Deno Deploy, используя встроенные реализации API KV и очереди, доступные там без какой-либо настройки.
Загрузка и настройка примера
⬇️ Загрузите или клонируйте полное приложение-пример здесь.
Вы можете запустить и развернуть это приложение-пример самостоятельно, используя инструкции в README файле репозитория GitHub.
Для запуска примера приложения вам также необходимо зарегистрироваться в Courier. Конечно, методы, которые вы увидите в приложении, с такой же лёгкостью можно применить к любому сервису уведомлений, от Amazon SNS до Twilio, но Courier предоставляет простой в использовании API уведомлений, который вы можете использовать с личной учетной записью Gmail для тестирования (в дополнение ко всем остальным интересным возможностям).
Основные функциональные возможности
После настройки и запуска проекта мы хотели бы обратить ваше внимание на несколько ключевых частей кода, реализующих механику планирования.
Подключение к KV и добавление обработчика событий при запуске приложения
Большая часть функциональности примера приложения находится в server.tsx в корневом каталоге. При запуске процесса приложения Deno, оно создает соединение с экземпляром Deno KV и добавляет обработчик событий, который будет обрабатывать сообщения по мере их получения из очереди.
// Create a Deno KV database reference
const kv = await Deno.openKv();
// Create a queue listener that will process enqueued messages
kv.listenQueue(async (message) => {
/* ... implementation of listener here ... */
});
Создание и планирование уведомления
После отправки нового заказа через форму в этом демонстрационном приложении вызывается функция enqueue, с задержкой в пять секунд до отправки уведомления по электронной почте.
app.post("/order", async (c) => {
const { email, order } = await c.req.parseBody();
const n: Notification = {
email: email as string,
body: `Order received for: "${order as string}"`,
};
// Select a time in the future - for now, just wait 5 seconds
const delay = 1000 * 5;
// Enqueue the message for processing!
kv.enqueue(n, { delay });
// Redirect back home with a success message!
setCookie(c, "flash_message", "Order created!");
return c.redirect("/");
});
Определение типа данных уведомления в TypeScript
Часто желательно работать с сильно типизированными объектами при вводе данных в очередь или выводе из неё. Хотя сообщения очереди изначально имеют тип unknown в TypeScript, мы можем использовать фильтры типов, чтобы указать компилятору форму данных, которую мы ожидаем.
Вот исходный код модуля notification, который мы используем для описания свойств уведомления в нашей системе.
// Shape of a notification object
export default interface Notification {
email: string;
body: string;
}
// Type guard for a notification object
export function isNotification(o: unknown): o is Notification {
return (
((o as Notification)?.email !== undefined &&
typeof (o as Notification).email === "string") &&
((o as Notification)?.body !== undefined &&
typeof (o as Notification).body === "string")
);
}
В server.tsx, мы используем экспортируемый фильтр типов, чтобы гарантировать, что мы реагируем на правильные типы сообщений.
kv.listenQueue(async (message) => {
// Use type guard to short circuit early if the message is of the wrong type
if (!isNotification(message)) return;
// Grab the relevant data from the message, which TypeScript now knows
// is a Notification interface
const { email, body } = message;
// Create an email notification with Courier
// ...
});
Отправка запроса к API Courier
Для отправки запланированного электронного письма мы используем REST API Courier. Более подробную информацию о REST API Courier можно найти в их документации.
const response = await fetch("https://api.courier.com/send", {
method: "POST",
headers: {
Authorization: `Bearer ${COURIER_API_TOKEN}`,
},
body: JSON.stringify({
message: {
to: { email },
content: {
title: "New order placed by Deno!",
body: "notification body goes here",
},
},
}),
});
© 2018–2024 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/deploy/kv/tutorials/schedule_notification