javascript - Node/Express/Request - 尝试使用参数代理 POST 请求会抛出 "Write after end"

标签 javascript node.js express request

我正在尝试将所有/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/

相关文章:

node.js - 为什么 node.js 处理 setTimeout(func, 1.0) 不正确?

javascript - 当我从此代码中删除 next() 时,为什么我的代码在第一次请求后无法终止?

node.js - 如何使用 Sequelize 迁移/种子插入初始数据?

c# - 对象不是函数错误

JavaScript - 检测跨域 iframe 中的滚动条?

javascript - 如何在嵌套在 Switch Nav 内的 Tab View 中打开 Drawer Navigator?

javascript - 获取 xml :id attribute using XML object

javascript - Vorpal.js 参数和参数

node.js - Azure Function App 对 Webhook 的初始响应

javascript - Node.js Express 中间件之间如何传递数据?