บันทึก
ณ วันที่ 22 กุมภาพันธ์ 2023 Vercel เสนองาน cron ในตัวอย่างเป็นทางการเพื่อเรียกใช้ฟังก์ชัน Serverless และ Edge ของคุณ อ่านเอกสารเพื่อเรียนรู้เพิ่มเติม โปรดทราบว่าคุณลักษณะนี้ฟรีในช่วงเบต้าเท่านั้นมันจะเป็นคุณลักษณะที่ต้องชำระสำหรับความพร้อมใช้งานทั่วไปซึ่งหมายความว่าเส้นทางการกระทำของ GitHub จะยังคงเกี่ยวข้องกับตัวเลือกฟรีอย่างสมบูรณ์
งาน cron กับการกระทำของ gitHub สำหรับแอปพลิเคชัน next.js บน vercel ▲
เนื่องจากแพลตฟอร์ม Vercel นั้นขับเคลื่อนด้วยเหตุการณ์ดังนั้นจึงไม่ได้บำรุงรักษาเซิร์ฟเวอร์ที่ทำงานอยู่คุณจึงไม่สามารถกำหนดเวลาการโทรบนเส้นทาง API หรือฟังก์ชั่นที่ไม่มีเซิร์ฟเวอร์ในแอปพลิเคชัน Next.js ของคุณ แม้ว่าจะมีบริการที่มีอยู่แล้วมากมายที่ให้งาน cron ที่กำหนดไว้ในที่สุดฉันก็ตัดสินใจว่าการกระทำของ GitHub นั้นเหมาะสมกับความต้องการที่ดีที่สุดของฉันเนื่องจากมันรวมเข้ากับโครงการใด ๆ ที่อาศัยอยู่ใน GitHub แล้ว
การกระทำของ GitHub ทั้งหมดอยู่ในไดเรกทอรี .github/workflows/ ของที่เก็บของคุณและเขียนใน Yaml
.github/workflows/starter.yaml เป็นเวิร์กโฟลว์พื้นฐานที่สุดที่จะช่วยให้คุณเริ่มต้นการกระทำ
ด้วยเหตุการณ์ที่กำหนดเวลาคุณสามารถดำเนินการงานตามช่วงเวลาที่กำหนด ตัวอย่างเช่นเวิร์กโฟลว์ที่ให้อยู่ .github/workflows/scheduled.yaml ดำเนินการตามคำขอ HTTP กับ Curl ทุก ๆ 60 นาที
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 }}'หากคุณมีปัญหาในการเขียนนิพจน์กำหนดการ cron ลองดูที่ Crontab Guru
เส้นทาง API และฟังก์ชั่นที่ไม่มีเซิร์ฟเวอร์เป็นโซลูชันที่ตรงไปตรงมาในการสร้าง API ของคุณด้วย next.js บน vercel ไฟล์ใด ๆ ภายใน pages/api ถูกแมปกับ /api/* และจะถือว่าเป็นจุดสิ้นสุด API แทน page
หากคุณใช้ฟังก์ชั่น Serverless โดยไม่คำนึงถึงรันไทม์คุณจะต้องใส่ไฟล์ลงใน /api/ ไดเรกทอรีที่รูทโครงการของคุณ
ในการเรียกใช้เส้นทาง API อย่างปลอดภัยและฟังก์ชั่นที่ไม่มีเซิร์ฟเวอร์ด้วยการกระทำของ GitHub คุณจะต้องจัดเตรียมคีย์การอนุญาตในส่วนหัวของการเรียก API ของคุณซึ่งเมื่อดำเนินการเมื่อเปรียบเทียบกับคีย์ที่เกี่ยวข้องในแอปพลิเคชัน Next.js ของคุณ
คุณสามารถทำสิ่งนี้ได้โดยการเพิ่มความลับที่เข้ารหัสลงในที่เก็บ GitHub ของคุณและส่งผ่านส่วนหัวของคำขอ HTTP ของคุณเช่นที่แสดงในตัวอย่างโค้ดก่อนหน้า นอกเหนือจากการเพิ่มคีย์ลงในที่เก็บ GitHub ของคุณแล้วคุณยังต้องเข้าถึงภายในแอปพลิเคชันถัดไปของคุณโดยเฉพาะอย่างยิ่งผ่านตัวแปรสภาพแวดล้อม
ตัวอย่าง pages/api/example.js ใช้โฟลว์การอนุญาตนี้
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 )
}
} ใช้ pages/api/example.ts สำหรับ 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 )
}
}