日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

mongooseのconnection周りでちょっとハマったからメモる

スクレイピングのストレージにMongoDBをなんとなく使っていて、その時にnodejsからmongooseを使ってデータを突っ込んでます。
その時になぜか固まってしまったので、原因を追ってみました。

Mongoose ODM v4.3.4

事象

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やめようかなみたいな気持ち。