Javascript Node.js使用请求模块挂起发布大型请求
我正在使用node.js请求模块向REST服务发布一个大的post请求(~150MB)。对于任何大于30MB的请求,它似乎都会挂起。我的猜测是,它正在对数据进行一些简单的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
JSON.stringify()
ing处理,而不是流式处理,一旦数据变得足够大,可以进行交换,它就会变得非常慢
我的请求是这样的:
request({
uri: url
method: 'post',
json: args, // args is a 150MB json object
}, function(err, resp, body) {
// do something
});
在浏览器中使用angularjs的$http发出的相同请求只需不到一分钟的时间,因此我知道这是客户端而不是服务器
有没有一个简单的方法来解决这个问题?更新答案:
我建议你尝试两件事:
var request = require('superagent');
request
.post(url)
.send(args)
.set('Accept', 'application/json')
.end(function(error, res){
});
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的写流版本吗?您好,您能找到解决方案吗?