http-proxy-middleware 不转发完整路径

Pie*_*nry 3 javascript proxy http-proxy node.js browser-sync

我正在尝试将 BrowserSync 配置为在服务器模式下工作,并使用http-proxy-middleware将我的 API 请求代理到在不同端口的同一台机器上运行的后端。我使用 Gulp 来启动 BrowserSync。

BrowserSync 在端口 8081 上运行。我的后端在 8080 上运行。

这是我创建代理中间件的方法:

var proxyApi = proxy('/api', {target : 'http://localhost:8080/api', logLevel : 'debug'});
Run Code Online (Sandbox Code Playgroud)

这是我从 Gulp 任务运行 BrowserSync 的方式:

// Init BrowserSync with proxies as middleware and based on the dest dir
browserSync.init({
    open: true,
    port: config.proxyPort,
    server: {
        baseDir: config.destDir,
        middleware: [proxyApi]
    },
    browser: "google chrome"
});
Run Code Online (Sandbox Code Playgroud)

输出 :

[HPM] Proxy created: /api  ->  http://localhost:8080/api
Run Code Online (Sandbox Code Playgroud)

一切看起来都不错。

但是当我点击 eg 时http://localhost:8081/api/users,输出是:

[HPM] GET /api/users/123 -> http://localhost:8080/api
Run Code Online (Sandbox Code Playgroud)

...我的客户收到 404 错误,因为/api它本身与后端的任何内容都不匹配。

根据我从文档和示例中的理解,目标实际上应该是 http://localhost:8080/api/users/123

为什么路径的其余部分(在这种情况下/users/123)被排除在外?

使用以下版本:

"gulp": "3.9.1",
"browser-sync": "2.16.0",
"http-proxy-middleware": "0.17.1",
Run Code Online (Sandbox Code Playgroud)

chi*_*rai 5

prependPath选项是true默认的。此选项由底层库提供:http-proxy

prependPath : true/false, Default: true - 指定是否要将目标路径添加到代理路径

有两种方法可以解决此问题:

1.) 将您的target从更改'http://localhost:8080/api''http://localhost:8080'

var proxyApi = proxy('/api', {target: 'http://localhost:8080', logLevel: 'debug'});
Run Code Online (Sandbox Code Playgroud)

2.) 或者,您可以将该选项设置prependPathfalse

var proxyApi = proxy('/api', {target: 'http://localhost:8080/api', prependPath: false, logLevel: 'debug'});
Run Code Online (Sandbox Code Playgroud)