如何为 Next.js API 请求进行 HTTP 代理

2024-01-30

我在网上尝试了很多方法,但到目前为止没有任何效果。

第一次尝试 (src/pages/api/proxy/[...slug].js):

import { createProxyMiddleware } from 'http-proxy-middleware';

// Create proxy instance outside of request handler function to avoid unnecessary re-creation
const apiProxy = createProxyMiddleware({
    target: 'http://localhost:5000',
    changeOrigin: true,
    pathRewrite: { [`^/api/proxy`]: '' },
    secure: false,
});

export default function (req, res) {
    apiProxy(req, res, (result) => {
        if (result instanceof Error) {
            throw result;
        }

        throw new Error(`Request '${req.url}' is not proxied! We should never reach here!`);
    });
};

给我这样的错误:

TypeError: Object(...) is not a function
    at Module../pages/api/[...slug].js (/home/user/app/client/.next/server/pages/api/[...slug].js:109:101)
    at __webpack_require__ (/home/user/app/client/.next/server/pages/api/[...slug].js:23:31)
    at /home/user/app/client/.next/server/pages/api/[...slug].js:91:18
    at Object.<anonymous> (/home/user/app/client/.next/server/pages/api/[...slug].js:94:10)
    at Module._compile (node:internal/modules/cjs/loader:1092:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1121:10)
    at Module.load (node:internal/modules/cjs/loader:972:32)
    at Function.Module._load (node:internal/modules/cjs/loader:813:14)
    at Module.require (node:internal/modules/cjs/loader:996:19)
    at require (node:internal/modules/cjs/helpers:92:18)
    at DevServer.handleApiRequest (/home/user/app/client/node_modules/next/dist/next-server/server/next-server.js:64:181)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:94:5)
    at async Object.fn (/home/user/app/client/node_modules/next/dist/next-server/server/next-server.js:56:492)
    at async Router.execute (/home/user/app/client/node_modules/next/dist/next-server/server/router.js:23:67)
    at async DevServer.run (/home/user/app/client/node_modules/next/dist/next-server/server/next-server.js:66:1042)

第二次尝试(next.config.js):

module.exports = {
    async rewrites() {
      return [
        {
          source: '/api/:path*',
          destination: 'http://localhost:5000/:path*' // Proxy to Backend
        }
      ]
    }
  }

这东西根本不起作用。

第三次尝试(与next-http-proxy-middleware https://www.npmjs.com/package/next-http-proxy-middleware):

// pages/[...all].ts
...
export default (req: NextApiRequest, res: NextApiResponse) => (
  isDevelopment
    ? httpProxyMiddleware(req, res, {
      // You can use the `http-proxy` option
      target: 'https://www.example.com',
      // In addition, you can use the `pathRewrite` option provided by `next-http-proxy`
      pathRewrite: {
        '^/api/new': '/v2',
        '^/api': '',
      },
    })
    : res.status(404).send(null)
);

这东西根本没有文档......不知道它是如何工作的。

第四次尝试(使用自定义下一个服务器 https://nextjs.org/docs/advanced-features/custom-server):

const express = require('express')
const next = require('next')
const { createProxyMiddleware } = require("http-proxy-middleware")

const port = process.env.PORT || 3000
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()

const apiPaths = {
    '/api': {
        target: 'http://localhost:3080', 
        pathRewrite: {
            '^/api': '/api'
        },
        changeOrigin: true
    }
}

const isDevelopment = process.env.NODE_ENV !== 'production'

app.prepare().then(() => {
  const server = express()
 
  if (isDevelopment) {
    server.use('/api', createProxyMiddleware(apiPaths['/api']));
  }

  server.all('*', (req, res) => {
    return handle(req, res)
  })

  server.listen(port, (err) => {
    if (err) throw err
    console.log(`> Ready on http://localhost:${port}`)
  })
}).catch(err => {
    console.log('Error:::::', err)
})

这会在下一个应用程序中快速运行。 我需要将下一个应用程序和服务器分开。这不是我想要的。


Using next-http-proxy-middleware您可以轻松地在 nextjs 中代理 api。

首先,看看如何在nextjs中使用api。 -https://nextjs.org/docs/api-routes/api-middlewares

  1. 创建一个[...all].ts文件在{yourproject_root}/pages/api/您的项目根路径的路径。
  2. 复制下面的代码并将其写入[...all].ts file.
export default (req: NextApiRequest, res: NextApiResponse) => httpProxyMiddleware(req, res, {
     // You can use the `http-proxy` option
     target:'https://www.example.com',
     // In addition, you can use the `pathRewrite` option provided by `next-http-proxy`
     pathRewrite: {
     '^/api/google':'https://google.com',
     '^/api/myhome':'https://github.com/stegano'
     },
});
  1. 运行 nextjs,打开浏览器,然后尝试连接localhost:3000/api/google or localhost:3000/api/myhome.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 Next.js API 请求进行 HTTP 代理 的相关文章

随机推荐

  • 将 ShapeRenderer.begin/end 嵌套在 SpriteBatch.begin/end 中

    是否可以使用绘制形状ShapeRenderer之间SpriteBatch begin and end calls 我已经尝试过 但没有结果 只绘制了 SpriteBatch 纹理 场景中没有形状 示例代码如下 shapeRenderer b
  • Objective-C 接口 - 声明变量与仅声明属性?

    在 Obj c 中 在 interface 中声明变量时 接口 NSObject 我的对象 我的对象 property 不安全 非原子 MyObject myObject 对比 仅将其声明为属性 接口 NSObject property 不
  • 通过 HTTP 回调函数进行 Google 地理编码?

    我想使用谷歌地理编码via HTTP在我的 AJAX Web 应用程序中将城市名称转换为经度和纬度的功能 但是 HTTP 地理编码器功能似乎不存在回调函数 http code google com apis maps documentati
  • 无法将操作提供者强制转换为共享操作提供者

    下面是我的活动的代码 import android app Activity import android os Bundle import android support v7 widget ShareActionProvider imp
  • Clojure 协议与 Scala 结构类型

    看完后里奇 希基的采访 http www infoq com interviews hickey clojure protocols on 协议 http clojure org protocols在 Clojure 1 2 中 对 Clo
  • 线程无异常地死亡

    我的一些工作线程遇到问题 我在线程的 run 方法中添加了一个包罗万象的异常语句 如下所示 try Runs the worker process which is a state machine while self set exitco
  • 为什么 ListView 项目不会增长以包裹其内容?

    我有一个相当复杂的 ListView 具有可变的列表项高度 在某些情况下 我需要在列表项中显示一个附加视图 该视图默认是隐藏的 View GONE 通过启用它 View VISIBLE 列表项的高度会增加 或者至少应该如此 问题 即使我将项
  • 如何将文件夹结构复制到另一个目录下?

    我有一些与复制文件夹结构相关的问题 事实上 我需要将pdf文件转换为文本文件 因此 我导入 pdf 的位置有这样的文件夹结构 D f subfolder1 subfolder2 a pdf 我想在 下创建确切的文件夹结构D g subfol
  • 在 Hibernate 中运行时急切加载整个对象图

    在说出 指定查询中的获取类型 之类的内容之前 请先阅读以下内容 那不是我所追求的 我正在寻找一种方法来急切加载完整的对象图 对象 它的所有子对象以及它们的所有子对象等等 I do not想要枚举要加载的所有属性 直到运行时我才认识它们 N
  • Linux中如何保护进程间共享的内存

    在 Linux 或其他现代操作系统中 每个进程的内存都受到保护 因此一个进程中的疯狂写入不会导致任何其他进程崩溃 现在假设我们在进程 A 和进程 B 之间共享内存 现在假设 由于软错误 进程 A 无意中向该内存区域写入了一些内容 鉴于进程
  • 如何在 React 中呈现未定义状态的数据?

    我正在 componentDidMount 内获取数据 但在初始渲染期间我未定义 然后再次渲染发生 并且在此期间状态变量被填充 现在 当它不是未定义的并且在填充之后 我想对其进行解构并在我的组件内显示数据 注意 getProjectDeta
  • C++ 中的变量作用域?

    在 C 中 main 中声明的任何变量都可以在整个 main 中使用 对吗 我的意思是 如果变量是在 try 循环中声明的 它们仍然可以在整个 main 中访问吗 因为我在 main 的 try 循环中声明了几个变量 但是如果我在 try
  • 如何获取字典中键的ReadOnlyCollection

    我的课程包含一个Dictionary
  • python time.strftime %z 始终为零而不是时区偏移

    gt gt gt import time gt gt gt t 1440935442 gt gt gt time strftime Y m d H M S z time gmtime t 2015 08 30 11 50 42 0000 g
  • 按实体名称和上次修改日期搜索

    我在 RavenDb 中存储了许多命令 它们都实现了 ICommand 我希望能够搜索上次修改的元数据和 Raven Entity Name 我目前正在对每个命令进行多重映射 如下所示 public class CommandAuditSe
  • 将 PHP 日期范围转换为 MYSQL 单个日期

    我有一个可用性日历 其中我当前正在逐个添加日期 并使用 mysql 查询来确定是否存在具有特定日期的行 并将当天的类别更改为 已预订 红色 我想在我的表单中输入一个范围 并通过 php 或 mysql 将其处理为多个单独的日期 我的日期格式
  • 使用 TensorFlow Dataset API 和 flat_map 的并行线程

    我正在将 TensorFlow 代码从旧的队列接口更改为新的数据集API https www tensorflow org api docs python tf data Dataset 使用旧界面我可以指定num threads论证tf
  • Powershell 检查本地管理员凭据

    我正在尝试运行一个需要管理员输入才能处理某些事情的脚本 我不想让脚本运行失败 而是尝试捕获错误并将其扔回到凭据中 但我找不到可以将本地管理凭据传递给陷阱的命令 有人有什么可能有用的东西吗 我发现很多都会检查域凭据 但这是一个本地管理员帐户
  • Java Swing:显示 JPopupMenu 后插入符侦听器停止触发

    我正在制作一个文本编辑器应用程序 并且遇到了一个问题 在显示 JPopupMenu 后键入或粘贴文本时 我的 CaretListener 不会被触发 我已将 CaretListener 添加到 JTextArea textArea addC
  • 如何为 Next.js API 请求进行 HTTP 代理

    我在网上尝试了很多方法 但到目前为止没有任何效果 第一次尝试 src pages api proxy slug js import createProxyMiddleware from http proxy middleware Creat