为什么在构建 NextJS 项目时会调用我的 API 路由?

Gui*_*eis 5 javascript next.js nextjs-dynamic-routing next.js13

我有一个在数据库中生成数据的 API 路由,该 API 路由仅在我在 Vercel 中设置的 CRON 作业中调用。

但是,每次我构建项目时,新数据都会显示在数据库中。我确实相信这是因为 NextJS 的本质是预先执行端点,因此它会在缓存中,但如何防止在数据库中添加数据?

在此输入图像描述 在此输入图像描述

代码很简单:https://github.com/guiifeliper/dart- throwing-monkey-crypto/blob/main/apps/monkey-crypto/app/api/generateTokens/route.ts

export const revalidate = 60 * 60 * 24 * 6; // every 6 days
export async function GET(request: Request) {
  const url =
    `${process.env.COINMARKETCAP_URL}/v1/cryptocurrency/listings/latest?limit=100` ??
    "";
  var options = {
    headers: {
      "X-CMC_PRO_API_KEY": process.env.COINMARKETCAP_API ?? "",
    },
    next: { revalidate: 60 * 60 * 24 * 6 },
  };

  const res = await fetch(url, options);
  const data = await res.json();

  const tokensList: Tokens[] =
    data?.data?.map((token: any) => {
      return {
        name: token.name,
        symbol: token.symbol,
        priceAtDrawn: token.quote["USD"].price,
        priceAtContest: 0,
        category: "Top-100",
        timeframe: getYearWeekString(),
      };
    }) ?? [];

  const BTCBenchmark = tokensList
    .filter((token) => token.symbol === "BTC")
    .map((token) => ({ ...token, category: "BTC-benchmark" }));

  if (tokensList?.length == 0) {
    return NextResponse.json(
      { message: "Error on token list" },
      { status: 500 }
    );
  }
  const selectedTokens = selectTokens(tokensList, 10);
  return await addTokensDrawn([...selectedTokens, ...BTCBenchmark]);
}

async function addTokensDrawn(data: any) {
  try {
    await prisma.tokenDrawn.createMany({ data });
    return NextResponse.json({ message: "Add Successfully" }, { status: 200 });
  } catch (error) {
    console.error("Request error", error);
    return NextResponse.json({ message: "Error on add" }, { status: 500 });
  }
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*ith 3

export const dynamic = 'force-dynamic'; 在函数定义之上使用。

afaik next.js 有一些检测来检查它是否可以 SSR 某些函数,例如检查您是否正在使用 headers 或 cookies,但是如果在函数定义之后的周围环境中没有检测到这些调用,则会出现问题,因此将力动态绕过检查。

https://github.com/vercel/next.js/issues/49441