使用默认 Next.js 开发服务器代理到后端

IT技术 javascript node.js reactjs next.js
2021-04-07 06:02:00

之前,当我使用 create-react-app 制作应用程序时,我会有一个setupProxy.js文件来路由与此类似的 API 请求

const proxy = require('http-proxy-middleware');
module.exports = function(app) {
    app.use('/api',
        proxy({
            target: 'http://localhost:8000',
            changeOrigin: true,
        })
    );
};

但这似乎不适用于 next.js。当我做同样的事情时,我会遇到各种错误。

谷歌搜索解决方案,很多人说要使用某种自定义服务器。但是我将如何使用默认的 nextjs 开发服务器完成像上面这样的代理?(相当于我的 package.json 中npm run devwhendevnext dev.

4个回答

现在在配置中有一个官方功能:重写

除了正常的路径重写,他们还可以将请求代理到另一个网络服务器

下一个.config.js:

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

参见Next.js 文档重写

我相信Rewrites只是基本的代理设置。更多代理配置需要设置自定义服务器
2021-05-29 06:02:00
如果有人在生产中的 nginx 配置中处理这个问题,这里是如何仅进行配置选项开发。nextjs.org/docs/api-reference/next.config.js/introduction
2021-06-02 06:02:00
当我想要 WebSocket 代理时,这个不起作用。它的握手失败了。
2021-06-07 06:02:00
我还是没有。我正在创建const对象并在那里存储硬编码的 URL。如果您找到任何解决方案,请分享它。
2021-06-16 06:02:00
@nemishzalavadiyaneel socket.io 对我来说也不起作用,使用重写...你能找到一个不涉及创建自定义服务器的解决方案吗?
2021-06-22 06:02:00

我的server.js设置,希望它有帮助

import express from 'express';
import next from 'next';
import proxy from 'http-proxy-middleware';

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

app.prepare().then(() => {
    const server = express();

    server.use(
        '/api',
        proxy({
            target: process.env.API_HOST,
            changeOrigin: true,
        }),
    );

    server.all('*', (req, res) => handle(req, res));

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

包.js

"scripts": {
    "dev": "NODE_ENV=development node -r esm server.js",
    "build": "NODE_ENV=production next build",
    "start": "NODE_ENV=production node -r esm server.js",
},
NODE_ENV=development node -r esm server.js
2021-06-02 06:02:00
从'http-proxy-middleware'导入{createProxyMiddleware};
2021-06-03 06:02:00
如果使用require那么const { createProxyMiddleware } = require('http-proxy-middleware');
2021-06-04 06:02:00
此外,我做了node server.mjs并删除了所有 ESM 自定义恶意软件。node 15 在 mjs 文件中使用 esm 很好地播放:)
2021-06-05 06:02:00
你好,你是这样做的吗?我做了 ti 并且 build/nodemon 太长了
2021-06-15 06:02:00

最终使用了类似于发布的内容。从这里使用的配置文件

https://github.com/zeit/next.js/tree/master/examples/with-custom-reverse-proxy

重写对我不起作用,使用 axios 也不起作用config.proxy

我使用了一个很好的旧常量:

const SERVER_URL = 
  process.env.NODE_ENV === 'production' ? 'https://produrl.com : 'http://localhost:8000';

export async function getStaticProps() {
  const data = axios.get(`${SERVER_URL}/api/my-route`)
  // ...
}

我更愿意代理请求并保持我的请求更清晰,但我没有一天花时间处理这个问题。

也许这个非常简单的设置会帮助其他人。