2013-07-12 113 views
5

我正在使用本地mongo rest api对应用程序进行原型开发,其中Node返回约400K的json。我使用以下方法来MAKET他请求蒙戈的原生API,并返回结果:NodeJS/ExpressJS在1个流中发送大量数据的响应

http.request(options, function(req) 
    { 
    req.on('data', function(data) 
     { 
console.log(data,data.rows); 
     response.send(200, data); 
     } 
    ); 
    } 
) 
.on('error', function(error) 
    { 
console.log('error\t',error); 
    response.send(500, error); 
    } 
) 
.end(); 

当我通过卷曲打http://localhost:8001/api/testdata,响应是正确的(这两个是什么输出从console.log节点的控制台,什么是接收通过卷曲)。但是当我通过应用程序中的ajax点击它时,流被中断,即使data输出到Node的控制台(终端)也很奇怪:它具有多个EOF,并且chrome开发工具中的调用的网络>响应结束于第一个EOF。

另外一个奇怪的事情:data样子:

{ 
    "offset": 0, 
    "rows": [ … ] 
} 

但没有节点也没有客户端(角),我可以引用data.rows(它返回undefined)。 typeof data返回[object Object]

EDIT两个卷曲和角度(如由节点报告)请求头是:

req.headers: { 
    'x-action': '', 
    'x-ns': 'test.headends', 
    'content-type': 'text/plain;charset=utf-8', 
    connection: 'close', 
    'content-length': '419585' 
} 

EDIT I(从节点的代替)检查响应头在两个角和卷曲直接annnd有(从节点从两个卷曲和角度相同的输出,而不是直接的)是一个分歧:

access-control-allow-headers: "Origin, X-Requested-With, Content-Type, Accept" 
access-control-allow-methods: "OPTIONS,GET,POST,PUT,DELETE" 
access-control-allow-origin: "*" 
connection: "keep-alive" 
content-length: "65401" // <---------------- too small! 
content-type: "application/octet-stream" 
//    ^-- if i force "application/json" 
// with response.json() instead of response.send() in Node, 
// the client displays octets (and it takes 8s instead of 0s) 
date: "Mon, 15 Jul 2013 18:36:50 GMT" 
etag: ""-207110537"" 
x-powered-by: "Express" 
+1

我会尝试读取Node中的标头和请求主体,并让它跟踪/打印出两种情况下会发生的情况。这是试图了解请求信息的不同之处或请求发生的方式,然后搜索解决curl请求和ajax请求之间差异的方法的具体答案(设置角等中的标头) – shaunhusain

+0

@ shaunhusain,我检查了头文件,他们是一样的,所以我也检查了整个'req'对象(使用FileMerge),它返回_0 differences_ – jacob

+1

以及令人毛骨悚然的:)抱歉,我不知道该怎么告诉你,如果发送给机器的数据完全相同,并且以两种不同的方式响应,我不知道发生了什么。也许我们惹怒了节点神或角神(可能是一些低级的OSI神),我们应该悔改。你如何捕获你的数据?我曾经使用Charles取得了很多成功(你确定这发生了吗?) – shaunhusain

回答

10

Node的http.request()在返回数据用于流式传输(如果他们明确说明了这一点,会很好)。因此,有必要将每个块写入Express的响应主体listen for the end of the http request(实际上没有记录),然后致电response.end()实际完成响应。

var req = http.request(options, function(res) 
    { 
    res.on('data', function(chunk) { response.write(chunk); }); 
    res.on('end', function() { response.end(); }); 
    } 
); 
req.on('error', function(error) { … }); 
req.end(); 

哪里response是快速的响应的初始客户端请求(卷曲的或有角的AJAX调用)。

+1

我认为这只是保存了我的生命[AngularUI typeahead与$资源冲突](http://stackoverflow.com/questions/15930339/how-to-tie-angular-uis-typeahead -with-a-server-via-http-for-server-side-optimi) –

+1

你实际上可以使用pipe()来简化实现。有一个很小的npm软件包可以处理锅贴(我认为它叫做Request)。 – jacob

+0

@jacod任何npm的链接,这是我得到[npmjs](https://www.npmjs.com/package/pipe) –