1

这是一个非常具体的问题,可能很难描述/理解。我不知道你需要多少输入,所以我将首先描述我的整个架构:我目前正在编写我的第一个微服务架构,我使用 nodejs、express 框架、ui 的把手和 http-proxy-middleware 来创建网络。

每个服务都从一个随机端口开始。然后服务在 api-gateway 注册。api-gateway 将“/api/web/[service]/[rest]”之类的 url 路由到“localhost:[serviceport]/[rest]”(这意味着 webapi-gateway 将 /[rest] 请求路由到服务在注册的服务端口上”。为了在普通端口 80 上运行整个前端,我创建了一个代理,它将所有以“/api”开头的请求路由到之前定义的网关。对于这两个重定向,我都使用 http-代理中间件:

this.app.use(rewritePath,
            this.proxy({
                target: "http://localhost:" + port,
                changeOrigin: true,
                pathRewrite: (path, req) => {
                    console.log(path);
                    var split = path.split("/");
                    split = split.splice(2, split.length);
                    split = split.join("/");
                    if (!split.startsWith("/")) {
                        split = "/" + split;
                    }
                    console.log(path + " to -> localhost:" + port + split);

                    return split;
                }
            })
        );  

我不需要对该代码的评论,只是为了更好地理解。总而言之:它有效。

我正在使用 Insomnia REST 客户端来测试系统。我有一个身份验证服务,用于对用户进行身份验证。我可以通过正文参数传递发布请求“localhost/api/web/auth/login”

{
    "username":"user",
    "password":"test"
}

我收到了 200 条回复,表示它有效。

现在我的问题是:我创建了一个显示表单的前端:

<form action="/api/web/auth/login" method="post">
   <input name="username" type="text" placeholder="Username" required>
   <input name="password" type="password" placeholder="Password" required>
   <input type="submit" value="Log in">
</form>

当我发布表单时,身份验证服务收到请求,但请求正文为空。为什么使用网站时请求正文为空,而我使用 REST 客户端时它可以工作?

4

2 回答 2

1

解决方案:

在其余客户端中,我使用了 json 编码数据,而表单提交了 formdata 编码数据。我添加了

this.app.use(bodyParser.urlencoded({ extended: true }));

应用程序的中间件。在那之后,我遇到了 http-proxy-middleware 和 bodyParser 不能很好地协同工作,如此处所述: https ://github.com/chimurai/http-proxy-middleware/issues/320 。

我使用共存解析器代理解决了这个问题(https://github.com/stuartZhang/coexist-parser-proxy(也在这里提出:https ://github.com/chimurai/http-proxy-middleware/issues/ 320#issuecomment-570889127 ))

于 2020-02-21T12:51:30.363 回答
0

我看到参数是从前端传递的。

于 2020-02-21T12:10:36.210 回答