mongoose4socketsclosures

我有一个脚本,我用来保存我所有的模型(前ex到reindex)。 经过几百次保存(我总共有900次),我得到了socketclosures错误。 我最近从3.xx升级到Mongoose 4.2.3,并开始看到这些错误。 我不知道还有什么可以继续下去的。

错误:

{ [MongoError: server ds0133252-a0.mongolab.com:133252 sockets closed] name: 'MongoError', message: 'server ds051252-a0.mongolab.com:51252 sockets closed' } { [MongoError: server ds0133252-a0.mongolab.com:133252 sockets closed] name: 'MongoError', .... 

该脚本是非常基本的:

 var mongoose = require(mongoose), Product = require('../models/product'), config = require('config'); mongoose.connect(config.db.mongo.connection, config.db.mongo.options); Product.find(function(err, products) { products.forEach(function(p) { p.markModified('description'); p.save(function(e, product) { if(e) console.log(e); console.log(product.id); }); }); }); 

这个模型非常复杂,但是一段时间没有改变。 我已经禁用了“保存”中间件有相同的错误,所以它应该是非常标准的。

build议?

您可以使用像async这样的asynchronousstream控制库来使用asynchronous迭代器,该asynchronous迭代器可以限制并发save操作的数量。

在这种情况下, async.eachLimit将会非常合适(doc链接是对each ,向下滚动查看eachLimit变体)。 例如,要将迭代限制为不超过5个并发保存:

 Product.find(function(err, products) { async.eachLimit(products, 5, function(p, callback) { p.markModified('description'); p.save(function(e, product) { if(e) console.log(e); console.log(product.id); callback(err); }); }); }); 

请注意,当完成save时,必须调用eachLimitcallback参数,以便库知道特定的迭代已完成。