如何在NextJS API端点中获取API调用源

e4eetjau  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(312)

我设置了一个接收令牌的API,我想将令牌存储在数据库中,但我也想存储原始URL。
假设API端点位于https://myapp.com/api/connect
现在,我想从我的网站https://mywebsite.net发送一个令牌
在我发送令牌后,我希望能够将令牌和网站URL存储到NextJS代码中的数据库中。
我的端点会将此信息存储到数据库:

{
  token: someRandomToken
  origin: https://mywebsite.net
}

我试着从处理程序记录整个请求对象,看看该信息是否存在,但控制台日志很快就填满了我的终端。

wdebmtf2

wdebmtf21#

在Next的服务器端环境中,您可以访问req.headers.host以及Vercel或其他平台的反向代理设置的其他头文件,以告知请求的实际来源,如下所示:
/pages/api/some-api-route.ts

import { NextApiRequest } from "next";

const LOCAL_HOST_ADDRESS = "localhost:3000";

export default async function handler(req: NextApiRequest) {
  let host = req.headers?.host || LOCAL_HOST_ADDRESS;
  let protocol = /^localhost(:\d+)?$/.test(host) ? "http:" : "https:";

  // If server sits behind reverse proxy/load balancer, get the "actual" host ...
  if (
    req.headers["x-forwarded-host"] &&
    typeof req.headers["x-forwarded-host"] === "string"
  ) {
    host = req.headers["x-forwarded-host"];
  }

  // ... and protocol:
  if (
    req.headers["x-forwarded-proto"] &&
    typeof req.headers["x-forwarded-proto"] === "string"
  ) {
    protocol = `${req.headers["x-forwarded-proto"]}:`;
  }

  let someRandomToken;
  const yourTokenPayload = {
    token: someRandomToken,
    origin: protocol + "//" + host, // e.g. http://localhost:3000 or https://mywebsite.net
  };

  // [...]
}

使用Typescript在挖掘属性时确实很有帮助,就像在这个例子中一样。我不知道你是否在使用Typescript,但是如果你没有,你必须删除NextApiRequest

相关问题