Note
Au 22 février 2023, Vercel propose officiellement des travaux CRON intégrés pour déclencher vos fonctions sans serveur et Edge. Lisez la documentation pour en savoir plus. Gardez à l'esprit que la fonctionnalité n'est gratuite que pendant sa phase bêta, ce sera une fonctionnalité payante pour la disponibilité générale, ce qui signifie que l'itinéraire des actions GitHub restera pertinent pour une option complètement gratuite.
Cron Jobs avec des actions github pour les applications Next.js sur Vercel ▲
Étant donné que la plate-forme Vercel est axée sur les événements, ne conservant donc pas un serveur en cours d'exécution, vous ne pouvez pas vraiment planifier les appels sur vos routes API ou vos fonctions sans serveur dans votre application Next.js. Bien qu'il existe de nombreux services préexistants qui fournissent des emplois Cron planifiés, j'ai finalement décidé que les actions GitHub répondent au mieux à mes besoins, car il s'intègre bien à tout projet qui vit déjà sur github, et c'est complètement gratuit.
Toutes les actions GitHub résident dans le répertoire .github/workflows/ de votre référentiel et sont écrites en yaml.
.github/workflows/starter.yaml est le flux de travail le plus élémentaire pour vous aider à démarrer avec les actions.
Avec les événements planifiés, vous pouvez exécuter des tâches à des intervalles spécifiés. Par exemple, le workflow fourni .github/workflows/scheduled.yaml exécute une demande HTTP avec Curl toutes les 60 minutes.
name : Hourly cron job
on :
schedule :
- cron : ' */60 * * * * '
jobs :
cron :
runs-on : ubuntu-latest
steps :
- name : Hourly cron job
run : |
curl --request POST
--url 'https://example.com/api/task'
--header 'Authorization: Bearer ${{ secrets.ACTION_KEY }}'Si vous avez du mal à écrire des expressions de calendrier Cron, jetez un œil à Crontab Guru.
Les routes d'API et les fonctions sans serveur fournissent une solution simple pour construire votre API avec Next.js sur Vercel. Tout fichier à l'intérieur des pages/api est mappé à /api/* et sera traité comme un point de terminaison de l'API au lieu d'une page .
Si vous utilisez des fonctions sans serveur, quel que soit l'exécution, vous devrez mettre les fichiers dans le répertoire /api/ Root de votre projet.
Pour déclencher en toute sécurité les routes API et les fonctions sans serveur avec les actions GitHub, vous devez fournir une clé d'autorisation dans l'en-tête de votre appel API, qui, une fois exécutée, est comparée à une clé correspondante dans votre application Next.js.
Vous pouvez y parvenir en ajoutant des secrets cryptés à votre référentiel GitHub et en les passant avec l'en-tête de votre demande HTTP, comme indiqué dans l'extrait de code précédent. En plus d'ajouter la clé à votre référentiel GitHub, vous devez également y accéder dans votre application Next.js, de préférence via des variables d'environnement.
L'exemple pages/api/example.js implémente ce flux d'autorisation.
export default function handler ( req , res ) {
const { APP_KEY } = process . env ;
const { ACTION_KEY } = req . headers . authorization . split ( " " ) [ 1 ] ;
try {
if ( ACTION_KEY === APP_KEY ) {
// Process the POST request
res . status ( 200 ) . json ( { success : 'true' } )
} else {
res . status ( 401 )
}
} catch ( err ) {
res . status ( 500 )
}
} Utilisez pages/api/example.ts pour TypeScript.
import type { NextApiRequest , NextApiResponse } from 'next'
export default function handler ( req : NextApiRequest , res : NextApiResponse ) {
const { APP_KEY } = process . env ;
const { ACTION_KEY } = req . headers . authorization . split ( " " ) [ 1 ] ;
try {
if ( ACTION_KEY === APP_KEY ) {
// Process the POST request
res . status ( 200 ) . json ( { success : 'true' } )
} else {
res . status ( 401 )
}
} catch ( err ) {
res . status ( 500 )
}
}