[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-node在vercel上實作低度頻率排程cron-job":3},{"id":4,"slug":5,"title":6,"description":7,"content":8,"date":9,"image":10,"imageAlt":6,"author":11,"categories":14,"path":20,"minRead":21},3349,"node在vercel上實作低度頻率排程cron-job","[Node]在Vercel上實作低度頻率排程(Cron-Job)","在Vercel上實作低度頻率排程(Cron-Job) 實作了一個放在Vercel的爬蟲，然後定期去執行，這篇記 […]","\u003Ch1>在Vercel上實作低度頻率排程(Cron-Job)\u003C\u002Fh1>\n\u003Cp>實作了一個放在Vercel的爬蟲，然後定期去執行，這篇記錄一下在Vercel上實作排程(cron-job)的過程。\u003Cbr \u002F>\n原本Vercel就有提供排程的作法，官方說明提到如果是低度頻率排程(例如每天)，可以使用GitHub Actions，範例如下：\u003C\u002Fp>\n\u003Cpre>\u003Ccode>name: daily-cron\non:\n  schedule:\n    - cron: &#039;0 1 * * *&#039;\njobs:\n  cron:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Call our API route\n        run: |\n          curl --request POST \\\n          --url &#039;https:\u002F\u002Fyoursite.com\u002Fapi\u002Fcron&#039; \\\n          --header &#039;Authorization: Bearer ${{ secrets.API_SECRET_KEY }}&#039;\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>GitHub Actions的作法在這邊就不提了。\u003C\u002Fp>\n\u003Ch2>概念\u003C\u002Fh2>\n\u003Cp>其實實作概念很簡單，就是多開一個需要驗證的api，然後排時間去觸發api，進而去執行要做的事情。\u003C\u002Fp>\n\u003Ch2>排程失效\u003C\u002Fh2>\n\u003Cp>但我實作完後發現怎樣排程都不會觸發，查了一下找到有個討論說明GitHub Actions的排程其實不穩定，常常會延時或不觸發，\u003Ca href=\"https:\u002F\u002Fupptime.js.org\u002Fblog\u002F2021\u002F01\u002F22\u002Fgithub-actions-schedule-not-working\u002F\" title=\"連結\">連結\u003C\u002Fa>。因此我改用了另外的免費cron服務，這類服務其實滿多的。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>補充：幾天後發現GitHub Actions的排程還是有成功運作，可能是初次觸發會需要一點時間(?，總之相較主打排程的服務，在GitHub Actions使用排程可能會有那麼一點不穩，請注意唷。\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch2>Api\u003C\u002Fh2>\n\u003Cp>官方提供的範例如下，需注意要做驗證所以必須準備API_SECRET_KEY，這個可以寫在Vercel的環境變數(Environment Variables)裡面\u003C\u002Fp>\n\u003Cpre>\u003Ccode>export default async function handler(req, res) {\n  if (req.method === &#039;POST&#039;) {\n    try {\n      const { authorization } = req.headers;\n\n      if (authorization === `Bearer ${process.env.API_SECRET_KEY}`) {\n        \u002F\u002F執行需要的事情\n        res.status(200).json({ success: true });\n      } else {\n        res.status(401).json({ success: false });\n      }\n    } catch (err) {\n      res.status(500).json({ statusCode: 500, message: err.message });\n    }\n  } else {\n    res.setHeader(&#039;Allow&#039;, &#039;POST&#039;);\n    res.status(405).end(&#039;Method Not Allowed&#039;);\n  }\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>像我使用express建置，最後用一個route接這隻api就可以。\u003C\u002Fp>\n\u003Cpre>\u003Ccode>app.post(&#039;\u002Fapi\u002Fcron&#039;, async (req, res) =&gt; {\n  handler();\n});\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>剛剛有提到這是低度頻率排程的作法，若是高度頻率官方建議用Upstash QStash 函式庫來實作，這部分就要再研究了XD\u003C\u002Fp>\n","2023-01-27T00:06:38","\u002Fapi\u002Fproxy-image?url=https%3A%2F%2Fpost.billxu.net%2Fwp-content%2Fuploads%2F2023%2F01%2F640px-Node.js_logo.svg.png",{"name":12,"link":13},"Chih Fan","http:\u002F\u002Fpost.billxu.net",[15,18],{"name":16,"slug":17},"Devops","devops",{"name":19,"slug":19},"node","\u002Fblog\u002Fnode在vercel上實作低度頻率排程cron-job",1]