Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js使用请求模块挂起发布大型请求_Javascript_Angularjs_Node.js_Post_Request - Fatal编程技术网

Javascript Node.js使用请求模块挂起发布大型请求

Javascript Node.js使用请求模块挂起发布大型请求,javascript,angularjs,node.js,post,request,Javascript,Angularjs,Node.js,Post,Request,我正在使用node.js请求模块向REST服务发布一个大的post请求(~150MB)。对于任何大于30MB的请求,它似乎都会挂起。我的猜测是,它正在对数据进行一些简单的JSON.stringify()ing处理,而不是流式处理,一旦数据变得足够大,可以进行交换,它就会变得非常慢 我的请求是这样的: request({ uri: url method: 'post', json: args, // args is a 150MB json object }, function(err

我正在使用node.js请求模块向REST服务发布一个大的post请求(~150MB)。对于任何大于30MB的请求,它似乎都会挂起。我的猜测是,它正在对数据进行一些简单的
JSON.stringify()
ing处理,而不是流式处理,一旦数据变得足够大,可以进行交换,它就会变得非常慢

我的请求是这样的:

request({
  uri: url
  method: 'post',
  json: args, // args is a 150MB json object
}, function(err, resp, body) {
  // do something
});
在浏览器中使用angularjs的$http发出的相同请求只需不到一分钟的时间,因此我知道这是客户端而不是服务器

有没有一个简单的方法来解决这个问题?

更新答案:

我建议你尝试两件事:

  • 查看superagent发布相同数据所需的时间。Superagent和请求一样简单

    var request = require('superagent');
     request
      .post(url)
      .send(args)
      .set('Accept', 'application/json')
      .end(function(error, res){
    
    });
    
  • 通过使用zlip压缩要发布的数据,您将把数据压缩到zlip缓冲区中,并将其作为输出写入

    var zlib = require('zlib');
    var options = {
     hostname: 'www.yourwebsite.com',
     port: 80,
     path: '/your-post-url',
     method: 'POST',
     headers: {'Content-Encoding': 'gzip'} // tell the server that the data is compressed
    };
    
    //args is your JSON stringified data
    
     zlib.gzip(args, function (err, buffer) {
    
     var req = http.request(options, function(res) {
     res.setEncoding('utf8');
     res.on('data', function (chunk) {
            // ... do stuff with returned data
     });
    });
    
    req.on('error', function(e) {
        console.log('problem with request: ' + e.message);
    });
    
    req.write(buffer); // send compressed data
    
    req.end();
    
    });
    

  • 流媒体不会自动发生。流式传输的API和发送完整缓冲区的API几乎总是不同的,这也不例外。在内存中提供完整javascript对象的大多数库都只打算
    JSON.stringify
    它,因为您已经支付了内存和I/O价格来将其加载到RAM中,那么为什么还要麻烦流式处理呢

    你可以试试,专门做这类事情的。下面是一个工作示例:

    var oboe = require("oboe");
    var args = {foo: "bar"};
    var url = "http://localhost:2998";
    
    oboe({url: url, body: args, method: "post"}).on("done", function (response) {
      console.log('response:', response);
    });
    


    旁白:与其猜测,不如确切地知道发生了什么。它是开源的。这是javascript。去挖吧

    抱歉,我意识到我的问题不够清楚(更新了问题以显示示例)。问题在于请求很大,而不是响应很大。我使用的是请求,而不是超级代理。我只是更新了我的答案,建议压缩post数据。其次,如果你能比较超级代理发布数据所花费的时间,这听起来是一个很常见的问题,那么肯定有现成的解决方案吗?旁白:从症状来看,这似乎相当明显。我现在已经检查过了,他们确实使用了JSON.stringify。顺便说一下,我正在寻找的接口完全相同:
    request(args,callback)
    。我只想在args较大时在引擎盖下传输。感谢您的编辑,但不幸的是,双簧管也
    JSON.stringify()。您选择流式传输的原因是,执行字符串化需要大量内存开销。JSON字符串可以比对象在内存中的表示形式大很多倍。我很好奇JSON.stringify有哪些替代方案,如果已经有了,我肯定会将它们构建到双簧管中(至少在节点下运行时,也可能在浏览器中)。您知道npm中JSON.stringify的写流版本吗?您好,您能找到解决方案吗?