NextJS 可以在 route handler 中使用 setTimeOut 吗

8次阅读

共计 551 个字符,预计需要花费 2 分钟才能阅读完成。

最近在用 NextJS 写 API 时,想要实现一个场景:用户操作成功后,服务器在 2s 后执行一个逻辑。

下面用 kv 做个示例:

import {kv} from "@vercel/kv";

export async function GET() {let page1 = await kv.get("page:1");

  setTimeout(() => {kv.incr("page-visit:1");
  }, 2000);

  return Response.json({data: page1});
}

export const runtime = "edge"; // 尝试过 nodejs 效果一样
export const fetchCache = "force-no-store";

其中 incr 在本地可以正常执行,但在 Vercel 上部署时会发生:

  • timeout=10ms 时,可以正常执行 incr
  • timeout=2000ms 时,本次 API 调用不会执行 incr,但会在下次调用时执行上一次的 incr

我的猜测是:本地 node 是守护进程,所以计时器不会被卸载掉,incr 正常执行;而 Vercel 上是 Serverless Function,10ms 内 CPU 分配还在就会执行 incr,2000ms 时 CPU 已经不分配了就不会执行 incr

我只是想薅 Vercel 的羊毛,请教大家如何才能做到延迟调用

正文完
 0