スクレイピングのストレージにMongoDBをなんとなく使っていて、その時にnodejsからmongooseを使ってデータを突っ込んでます。
その時になぜか固まってしまったので、原因を追ってみました。
事象
connection生成して、MongoDBにデータ突っ込もうとしたら止まりました。
試したコマンドとコードは下記の通りです。
$npm i --save mongoose ... $node -v v4.1.0 $node src/main.js mongo connection opened # ここで止まります
- src/main.js
var mongoose= require("mongoose"); var logger = console; var db = mongoose.createConnection(); db.on('open', function() { logger.info("mongo connection opened") }); db.on('close', function() { logger.info("mongo connection closed") }); db.open("mongodb://localhost/test"); var schema = new mongoose.Schema({ id: String }); mongoose.model("Test", schema); var Model = mongoose.model("Test"); // 結論ここが問題 var m = new Model({ id: "hogehoge" }); // console.logとかでどこで止まってるかを見るとここで止まります。 m.save(function(e1) { e1 && logger.error(e1); Model.count({}, function(e2, count) { e2 && logger.error(e2); logger.info(count); mongoose.disconnect(); }); });
原因(?)と対策
その1
コネクションを作った場合、そのコネクションからモデルを取得しないといけないようです。
var Model = mongoose.model("Test");
ではなく var Model = db.model("Test");
にします。
- src/main.js
var mongoose= require("mongoose"); var logger = console; var db = mongoose.createConnection(); db.on('open', function() { logger.info("mongo connection opened") }); db.on('close', function() { logger.info("mongo connection closed") }); db.open("mongodb://localhost/test"); var schema = new mongoose.Schema({ id: String }); mongoose.model("Test", schema); // var Model = mongoose.model("Test"); // 結論ここが問題 var Model = db.model("Test"); var m = new Model({ id: "hogehoge" }); m.save(function(e1) { e1 && logger.error(e1); Model.count({}, function(e2, count) { e2 && logger.error(e2); logger.info(count); mongoose.disconnect(); }); });
- 実行結果
$node src/main.js mongo connection opened 9 mongo connection closed
その2
そもそもコネクションはmongooseオブジェクトが持っているようなので、それを使いましょう。
var db = mongoose.createConnection();
を var db = mongoose.connection;
に変えます。
var mongoose= require("mongoose"); var logger = console; //var db = mongoose.createConnection(); var db = mongoose.connection; db.on('open', function() { logger.info("mongo connection opened") }); db.on('close', function() { logger.info("mongo connection closed") }); db.open("mongodb://localhost/test"); var schema = new mongoose.Schema({ id: String }); mongoose.model("Test", schema); var Model = mongoose.model("Test"); // 結論ここが問題 var m = new Model({ id: "hogehoge" }); m.save(function(e1) { e1 && logger.error(e1); Model.count({}, function(e2, count) { e2 && logger.error(e2); logger.info(count); mongoose.disconnect(); }); });
- 実行結果
$node src/main.js mongo connection opened 10 mongo connection closed
動いたみたい。
そもそもMongoやめようかなみたいな気持ち。