Javascript Node/Express/Request-尝试使用参数throws“代理POST请求;“在结尾后写”;

Javascript Node/Express/Request-尝试使用参数throws“代理POST请求;“在结尾后写”;,javascript,node.js,express,request,Javascript,Node.js,Express,Request,我试图将所有/api/请求从本地节点服务器代理到远程服务器,同时将一些身份验证参数嵌入其中 我目前的方法似乎可以很好地用于带有查询参数的GET和POST,只要我没有将“form”参数提供给Request库,但一旦我包含它,服务器就会开始抛出错误:write after end var express = require("express"); var request = require("request"); var parser = require("body-parser"); var st

我试图将所有/api/请求从本地节点服务器代理到远程服务器,同时将一些身份验证参数嵌入其中

我目前的方法似乎可以很好地用于带有查询参数的GET和POST,只要我没有将“form”参数提供给Request库,但一旦我包含它,服务器就会开始抛出错误:write after end

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/*");
var express=require(“express”);
var请求=要求(“请求”);
var parser=require(“主体解析器”);
var strftime=要求(“strftime”);
var-app=express();
var路径=要求(“路径”);
var端口=80;
var apirl=”http://example.com/";
var apiUser=“示例”;
var apiPass=“示例”;
app.use(express.static(path.join(uu dirname,“/dist”));
use(parser.json());
use(parser.urlencoded({extended:true}));
app.get(“/api/*/”,函数(req,res){
log((strftime(“%H:%M:%S”)+“| GET->”+req.url));
var url=apirl+req.url;
请求管道(请求获取(url、{
认证:{
用户:apiUser,,
通行证:apiPass
}
})).管道(res);
});
app.post(“/api/*/”,函数(req,res){
log((strftime(“%H:%M:%S”)+“|POST->”+req.url));
var url=apirl+req.url;
请求管道(请求发布(url、{

表单:req.body,//这已经有两个月了,所以OP可能已经开始了,但我刚刚遇到了这个问题,我想我会将我的解决方案发布给未来的搜索者。问题是,当阅读器结束时,请求编写器正在结束,因此无法写入正文(并抛出“结束后写入”)。因此,我们需要告诉它不要结束。当传递实体时,需要向管道选项添加{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);
});