Node / Express / Request – 尝试使用参数代理POST请求抛出“Write after end”

我试图将所有/ api /请求从本地节点服务器代理到远程服务器,同时向它们embedded一些authentication参数。

我目前的做法似乎工作正常GET的查询参数和POST,只要我不给“表单”参数的请求库,但只要我包括它,服务器开始抛出错误:结束后写。

var express = require("express"); var request = require("request"); var parser = require("body-parser"); var strftime = require("strftime"); var app = express(); var path = require("path"); var port = 80; var apiUrl = "http://example.com/"; var apiUser = "example"; var apiPass = "example"; app.use(express.static(path.join(__dirname, "/dist"))); app.use(parser.json()); app.use(parser.urlencoded({extended: true})); app.get("/api/*/", function(req, res) { console.log((strftime("%H:%M:%S") + " | GET -> " + req.url)); var url = apiUrl + req.url; req.pipe(request.get(url, { auth: { user: apiUser, pass: apiPass } })).pipe(res); }); app.post("/api/*/", function(req, res) { console.log((strftime("%H:%M:%S") + " | POST -> " + req.url)); var url = apiUrl + req.url; req.pipe(request.post(url, { form: req.body, // <----- RESULTS IN "write after end" error auth: { user: apiUser, pass: apiPass } })).pipe(res); }); app.listen(port); console.log("Development server started, listening to localhost:" + port); console.log("Proxying /api/* -> " + apiUrl + "/api/*"); 

这可能与身体分析器中间件有关,但是我找不到这个问题的任何解决方法,我不明白为什么“form:req.body”会破坏脚本。 loggingreq.body似乎输出预期的参数。

我也试图用.form(req.body)替代链接语法,但结果是一样的。

这已经有两个月的时间了,所以OP可能已经开始了,但是我刚刚遇到了这个问题,并且认为我会为未来的search者发布我的解决scheme。 问题在于请求书写器在读取器结束时结束,因此不能写入正文(并抛出'写入结束')。 所以我们需要告诉它不要结束。 传递正文时,需要将{end:false}添加到pipe道选项。 例如:

 app.post("/api/*/", function(req, res) { console.log((strftime("%H:%M:%S") + " | POST -> " + req.url)); var url = apiUrl + req.url; req.pipe(request.post(url, { form: req.body, auth: { user: apiUser, pass: apiPass } }), { end : false }).pipe(res); });