我有一个在我的数据库中生成数据的API路径,这个API路径只在我的Cron作业(job)集中在Vercel中调用.

然而,每次我构建项目时,数据库中都会显示新的数据.我相信这是因为NextJS的本质是预先执行一个终结点,以便它将在缓存中,但我如何防止在我的数据库中添加数据?

enter image description here enter image description here

密码很简单:https://github.com/guifeliper/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 });
  }
}

推荐答案

使用export const dynamic = 'force-dynamic'; 位于您的函数定义之上.

AFAIK next.js有一些检测,可以判断它是否可以SSR一些函数,比如判断您是否正在使用头文件或cookie,但是如果在函数定义之后的直接环境中没有检测到这些调用,那么就有问题,所以使用force-Dynamic将绕过判断.

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

Javascript相关问答推荐

nPM审计始终发现0个漏洞

基于每个索引迭代嵌套对象

JS生成具有给定数字和幻灯片计数的数组子集

我在这个黑暗模式按钮上做错了什么?

Klaro与Angular的集成

通过使用100%间隔时间来代表我们还剩多少时间来倒计时

基于变量切换隐藏文本

如何从Intl.DateTimeFormat中仅获取时区名称?

Webpack在导入前混淆文件名

邮箱密码重置链接不适用于已部署的React应用程序

为什么当我更新数据库时,我的所有组件都重新呈现?

是否可以将Select()和Sample()与Mongoose结合使用?

在查看网页时,如何使HTML中的按钮工作方式类似于鼠标上的滚轮或箭头键?

postman 预请求中的hmac/sha256内标识-从js示例转换

如何使用[ModelJSON,ArrayBuffer]调用tf.loadGraphModelSync

为什么在运行于<;img>;事件处理程序中的JavaScript中x和y是不可变的?

通过解构/功能组件接收props-prop验证中缺少错误"

如何使用Reaction路由导航测试挂钩?

如何在Java脚本中并行运行for或任意循环的每次迭代

重新渲染过多(&Q).REACT限制渲染次数以防止无限循环.使用REACT下拉菜单时