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
时,必须调用eachLimit
的callback
参数,以便库知道特定的迭代已完成。