我正在尝试用快速js和mikeal / request库做一个简单的代理:
客户端应用程序在特定路径(/ api)上调用expressjs,所有请求都转发到远程机器
它不起作用,我必须遗漏一些明显的东西。
expressjs代码:
app.use('/api', function(req, res) {
var url = config.api + req.url;
var auth = authlib.createTokenHeader(req.user) || {};
var forwarded = { 'X-Forwarded-For': req.connection.remoteAddress };
console.log('Forwarding to api ' + url);
req.pipe(request({
uri:url,
headers: _.merge(authlib.stripSensitiveHeaders(req.headers), auth, forwarded),
})).pipe(res);
});
向http://localhost:9000/api/account
发出PUT请求时,grunt日志显示:
Forwarding to api http://xxx.xxx.xxx/account
PUT /api/account 200 120005ms
Forwarding to api http://xxx.xxx.xxx/account
PUT /api/account 200 120006ms
在远程API上,apache日志显示已发出请求:
xx.xx.xx.xx - - [23/Feb/2014:17:44:23 +0000] "PUT /account HTTP/1.1" 400 189 "http://localhost:9000/login" "Mozilla/5.0"
xx.xx.xx.xx - - [23/Feb/2014:17:46:23 +0000] "PUT /account HTTP/1.1" 400 189 "http://localhost:9000/login" "Mozilla/5.0"
最终Chrome发出了收到的空回复:
PUT http://localhost:9000/api/account net::ERR_EMPTY_RESPONSE
问题是为什么我收到两个请求,120s超时来自哪里?
我试图让它更简单,但结果是一样的:
app.use('/api', function(req, res) {
req.pipe(request(config.api + req.url)).pipe(res);
});
如果我在同一台机器上使用像Chrome一样的东西来发布它,那就有用了 http://xxx.xxx.xxx/account端点
答案 0 :(得分:0)
最终发现了与此代码无关的问题。
由于我正在使用yeoman完整的堆栈模板,expressjs有各种其他设置,而搞砸了东西的是json:
app.use(express.json());
删除此行解决了这个问题。现在我需要找出原因:)