【问题标题】:Proxy request error when trying to send post request from React to Node, proxy is working fine on get requests尝试从 React 向 Node 发送发布请求时出现代理请求错误,代理在获取请求时工作正常
【发布时间】:2020-05-06 22:18:53
【问题描述】:

我在尝试发送 POST 请求以登录用户时遇到了这个确切的错误:

[HPM] 尝试将请求 /api/login 从 localhost:3000 代理到 http://localhost:5000 (ECONNRESET) (https://nodejs.org/api/errors.html#errors_common_system_errors) 时出错

起初我认为这是与如何在客户端和服务器之间设置代理有关的问题,但我可以很好地从后端获取数据。因此,当我尝试将数据发布到后端时,问题必须解决(我认为??)

这是我的 React 登录组件:

import React from 'react'

class Login extends React.Component {
    state = {}

    handlChange = event => {
        const { name, value } = event.target
        this.setState({ [name]: value })
    }

    handleSubmit = () => {
        fetch("/api/login", {
            method: "POST",
            headers: {
                'content-type': 'application/json' 
            },
            body: JSON.stringify(this.state)
        })
    }

    render() {
        console.log(this.state)
        return (
            <div>
                <form onSubmit={this.handleSubmit}>
                    <input type="text" name="username" value={this.state.username} onChange={this.handlChange} placeholder="Username" />
                    <input type="password" name="password" value={this.state.password} onChange={this.handlChange} placeholder="Password" />
                    <button>Login</button>
                </form>
            </div>
        )
    }
}


export default Login 

按照 React 文档的建议,我在 src 文件夹中使用 setUpProxy.js 文件来设置代理,它看起来像这样:

const proxy = require("http-proxy-middleware")

module.exports = function(app) {
    app.use(
        '/api',
        proxy({
            target: 'http://localhost:5000',
            changeOrigin: true 
        })
    );
};

客户端应用程序是使用 create-react-app 构建的,如果这有什么不同的话

【问题讨论】:

  • 当你的代码运行不正常时使用代码块而不是代码片段,例如因为它是针对服务器平台的。

标签: javascript node.js reactjs


【解决方案1】:

如果您使用的是 express like 的中间件

app.use(express.json())
app.use(express.urlencoded({ extended: true }))

您可以尝试将该中间件设置移动到您的代理设置下方。据我了解,执行内置正文解析器功能的 express 中间件将请求流转换为常规对象,这可能是问题所在。

将中间件移到代理下方解决了我们的问题。

我知道这篇文章很老了,但它似乎和Github issue (Hanging Post requests) 一样。

这可能是也可能不是您需要的解决方案,但也许它会帮助那里的人......

【讨论】:

    【解决方案2】:

    我们遇到了类似的问题,事实证明并非所有标头都由 HPM 转发。尝试在选项中添加 Keep-Alive 标头:

    const proxy = require("http-proxy-middleware")
    
    module.exports = function(app) {
        app.use(
            '/api',
            proxy({
                target: 'http://localhost:5000',
                 headers: {
                    "Connection": "keep-alive"
                },
                followRedirects: true,
                changeOrigin: true 
            })
        );
    };
    

    【讨论】:

    • 我试过了,现在我的 /api/register 路由工作了,但我仍然遇到错误。数据正在到达后端并正在创建一个新用户,但之后没有任何反应。创建用户后,用户应该被重定向到他们的个人资料,但这不会发生。这就像客户端和服务器之间的连接在请求发送后被终止。
    • 您需要将followRedirects选项设置为true(默认为false)
    • 还是不行,是不是服务器端有什么东西会导致这个问题?
    猜你喜欢
    • 2021-12-21
    • 2019-10-10
    • 1970-01-01
    • 2020-07-21
    • 2022-06-24
    • 2020-07-10
    • 2015-08-02
    • 2019-05-29
    • 2021-01-14
    相关资源
    最近更新 更多