我正在尝试将所有/api/请求从本地 Node 服务器代理到远程服务器,同时向它们嵌入一些身份验证参数。
只要我不向请求库提供“form”参数,我当前的方法似乎适用于带有查询参数的 GET 和 POST,但是一旦我包含它,服务器就会开始抛出 Error: write after结束。
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/*");
这可能与 body-parser 中间件有关,但我找不到解决此问题的任何方法,而且我不太明白为什么“form: req.body”会破坏脚本。记录 req.body 似乎输出了预期的参数。
我还尝试了使用 .form(req.body) 的替代链接语法,但结果是相同的。
最佳答案
这已经有几个月了,所以 OP 可能已经继续了,但我刚刚遇到了这个问题,并认为我应该为 future 的搜索者发布我的解决方案。问题在于,当读取器结束时,请求写入器也随之结束,因此无法写入正文(并抛出“结束后写入”)。所以我们需要告诉它不要结束。传递主体时,需要将 { end : false } 添加到管道选项中。例如:
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);
});
关于javascript - Node/Express/Request - 尝试使用参数代理 POST 请求会抛出 "Write after end",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30436530/