nodejs使用express和mikeal / request库代理

时间:2014-02-23 18:20:55

标签: node.js express

我正在尝试用快速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端点

1 个答案:

答案 0 :(得分:0)

最终发现了与此代码无关的问题。

由于我正在使用yeoman完整的堆栈模板,expressjs有各种其他设置,而搞砸了东西的是json:

app.use(express.json());

删除此行解决了这个问题。现在我需要找出原因:)