Vercel Cron 作业未使用 Next 13 Route API 触发

问题描述 投票:0回答:2

我正在使用 Next 13 应用程序目录。

我有一个route.ts文件:

app/api/cron/set-completed-goals/route.ts
import { prisma } from '@/lib/prisma';
import { NextResponse } from 'next/server';
export async function GET() {
  const users = await prisma.user.findMany();

  for (const user of users) {
    const goals = await prisma.goal.findMany({
      where: { userId: user.id },
    });

    for (const goal of goals) {
      if (goal?.percentage ?? 0 >= 100) {
        await prisma.$transaction([
          prisma.user.update({
            where: { id: user.id },
            data: {
              completedGoals: [...user.completedGoals, goal.id],
            },
          }),
          prisma.goal.update({
            where: { id: goal.id },
            data: { percentage: 0 },
          }),
        ]);
      }
    }
  }
  return NextResponse.json({ message: 'Completed goals updated' });
}

还有 vercel.json:

{
  "crons": [
    {
      "path": "/api/cron/set-completed-goals",
      "schedule": "0 0 * * *"
    }
  ]
}

当我在本地主机中手动触发该函数时,它会按预期工作。

但是,当我在 vercel 上手动触发 cron 作业时,我在日志中看到:

200
[GET] /api/cron/set-completed-goals

它似乎返回 200,但我的数据库中实际上没有任何变化。

我是 cron 作业的新手,目前还不清楚出了什么问题。

非常感谢任何帮助。

reactjs next.js cron vercel
2个回答
0
投票

现在开始工作了。

我相信由于 Vercel 对 Hobby 计划的限制,它无法正常工作,并且不知何故超过了我的使用情况。

https://vercel.com/blog/cron-jobs#limits-of-cron-jobs-and-vercel-functions

希望他们有更好的日志或某种限制使用视图来反映正在发生的事情,但事实就是如此。


0
投票

我遇到了同样的问题,但我确实用这段代码解决了它。

export const revalidate = 0
export async function GET(req: Request) {
    // your db logic
    return NextResponse.json({
        result:result
    });
}

我希望这段代码可以帮助你......

© www.soinside.com 2019 - 2024. All rights reserved.