筆記
截至2023年2月22日,Vercel正式提供內置CRON作業,以觸發您的無服務器和邊緣功能。閱讀文檔以了解更多信息。請記住,該功能僅在Beta階段免費免費,這將是一般可用性的付費功能,這意味著GitHub Action Route將與完全免費的選項相關。
Next.js應用程序的Cron作業。
由於Vercel平台是由事件驅動的,因此不維護運行服務器,因此您無法在下一個.js應用程序中真正安排在API路由或無服務器功能上的電話。儘管有許多預先存在的服務提供了預定的Cron作業,但我最終決定GitHub Actions適合我的需求,因為它與已經居住在Github上的任何項目都很好地集成了,而且它是完全免費的。
所有GitHub操作都位於您的存儲庫的目錄.github/workflows/中,並用YAML編寫。
.github/workflows/starter.yaml是最基本的工作流程,可幫助您開始動作。
通過計劃的事件,您可以按指定的間隔執行任務。例如,提供的工作流程.github/workflows/scheduled.yaml每60分鐘執行捲曲的HTTP請求。
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路由和無服務器功能為使用Vercel上的Next.js構建API提供了一種直接的解決方案。文件夾pages/api中的任何文件均映射到/api/* ,並將視為API端點而不是page 。
如果您使用的是無服務器功能,則無論運行時如何,都需要將文件放入項目的根部/api/ Directory中。
要使用GITHUB操作安全觸發API路由和無服務器功能,您需要在API調用標題中提供授權密鑰,當執行時,該鍵與Next.js應用程序中的相應密鑰相比。
您可以通過將加密的秘密添加到GitHub存儲庫中,並使用HTTP請求的標題將其添加來實現這一目標,如先前的代碼段所示。除了將密鑰添加到github存儲庫中,您還需要在下一個js應用程序中訪問它,最好通過環境變量訪問。
示例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進行打字稿。
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 )
}
}