next.js 为什么这个API请求使用node-fetch返回的东西与使用node的内置fetch返回的东西不同?

whhtz7ly  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(171)

我有一个节点应用程序,它发送一个API请求来触发Manifold(一个假的投注网站)上的投注。
当我使用node-fetch时,它会进行打赌。当我使用内置的fetch时,如果有旧版本的bet,它会返回旧版本的bet(可能缓存了以前的HTTP响应?)。重新启动节点服务器并不能解决此问题-它似乎仍然返回旧的响应。
除了注解或取消注解node-fetch的导入(第3行)之外,没有其他更改。
如果我在postman中运行相同的请求,它就会下注。
API/placebet/routes中的代码。ts

import { NextResponse } from 'next/server';

import fetch from 'node-fetch';

export async function POST(request: Request) {
  const body = await request.json();
  
  const sendTime = Date.now();

  console.log('placeBet called with body:', body.apiKey, body.betAmount, body.outcomeToBuy, body.marketID);
  
  const res = await fetch('https://manifold.markets/api/v0/bet', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Key ${body.apiKey}`,
    },
    body: JSON.stringify({
      amount: body.betAmount,
      outcome: body.outcomeToBuy,
      contractId: body.marketID,
    }),
  });
  
  if (!res.ok) {
    const errorDetails = await res.json();
    console.error(errorDetails);
    return NextResponse.json({error: "Error placing the bet"}, {status: 500 });
  }
  
  const data = await res.json();
  
  // Check if the bet's timestamp is before sendTime
  const betTimestamp = data.fills[0].timestamp;

  if (betTimestamp < sendTime) {
    console.error('Error: Bet timestamp is before sendTime');
    console.log(data);
    return NextResponse.json({error: "Bet timestamp is before sendTime"}, {status: 500 });
  }

  console.log("Bet response", data)

  return NextResponse.json(data)
}
lfapxunr

lfapxunr1#

这是因为内置的fetch函数缓存了HTTP响应。
您可以尝试在请求头中使用'cache-control': 'no-cache',这将确保您的响应不会被缓存,并且每次发出请求时都会生成一个新的响应。
你的POST方法看起来像这样:

const res = await fetch('https://manifold.markets/api/v0/bet', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'Authorization': `Key ${body.apiKey}`,
    'cache-control': 'no-cache', // add this line to disable caching
  },
  body: JSON.stringify({
    amount: body.betAmount,
    outcome: body.outcomeToBuy,
    contractId: body.marketID,
  }),
});

相关问题