web-dev-qa-db-ja.com

Mongoose.js instance.save()コールバックが起動しない

var mongo = require('mongoose');
var connection = mongo.createConnection('mongodb://127.0.0.1/test');

connection.on("error", function(errorObject){
  console.log(errorObject); 
  console.log('ONERROR');
});

var Schema = mongo.Schema;
var BookSchema = new Schema({ title : {type : String, index : {unique : true}}});
var BookModel = mongo.model('abook', BookSchema);
var b = new BookModel({title : 'aaaaaa'});

b.save( function(e){ 
  if(e){
    console.log('error')
  }else{
    console.log('no error')
}});

「エラー」も「エラーなし」も端末に出力されません。さらに、connection.on'error 'も起動しないようです。 MongoDbが実行されていることを確認しました。

25
LDK

これは、モデルをグローバルマングースオブジェクトに追加しているが、モデルが含まれていない別の接続mongo.createConnection()を開いている場合です。モデルには接続がないため、データベースに保存できません。

これは、グローバルマングース接続でmongoに接続することで解決されます。

var connection = mongo.createConnection('mongodb://127.0.0.1/test');
// becomes
var connection = mongo.connect('mongodb://127.0.0.1/test');

または、モデルを個別の接続に追加します。

var BookModel = mongo.model('abook', BookSchema);
// becomes
var BookModel = connection.model('abook', BookSchema);
68
aaronheckmann

私はアーロンの答えが本当に好きです、そして彼のおかげで私は今問題を修正するための道を進んでいます...私はまだそこにいませんが!これが私の特定の問題です:

スキーマとモデルを別々のファイルで定義して、プロジェクト間で再利用できるようにしたい。したがって、例として、次のようなW8DBItem.jsという名前のファイルがあります。

var mongoose = require('mongoose');
var itemSchema = new mongoose.Schema({ name: {type: String, required: true}});
module.exports = mongoose.model('W8DBItem', itemSchema);

私のプログラムファイルでは、これを行います:

var mongoose = require('mongoose');
var W8DBItem = require('../w8/W8DBItem.js'); 
var dbURL ='mongodb://localhost:27017/default';
var mongoOptions = { useNewUrlParser: true, bufferCommands: false }
mongoose.connect(dbURL, mongoOptions);

var db = mongoose.connection;

// DEAL WITH CONNECTION ERROR
db.on('error', console.error.bind(console, 'connection error:'));

// PREP DATA
var aWeight = { name: "My Test Name" };
var newWeightItem = W8DBItem(aWeight);

// CONNECTION ESTABLISHED
db.once('open', function() {
    console.log("Here 1")

    // TRY TO SAVE
   newWeightItem.save(function (err, newWeightItem) {
    if (err) { 
        console.log("Here 2");
        console.log(err);
    }
    else {
        console.log("Here 3");
        console.log(newWeightItem);
    }
  });
});

このプログラムを実行すると、「Here 1」が表示されますが、コンソールに「Here2」または「Here3」が表示されることはありません。

Aaronの投稿から、W8DBItemオブジェクトには関連付けられた(そして開いている)接続がないことがわかりましたが、問題を修正する方法がわかりません。 W8DBItem.jsファイルでDBに接続できましたが、サーバー情報をオブジェクトでハードコーディングするのは本当に好きではありません-これらのオブジェクトを別のファイルで使用したいのですが、おそらく異なるサーバーで。

アイデアや提案は大歓迎です!

[編集:解決策が見つかりました!!!]

オブジェクトファイルからmongoose.modelをエクスポートする代わりに、スキーマのみをエクスポートしています。

var mongoose = require('mongoose');
var itemSchema = new mongoose.Schema({name: {type: String, required: true}});
module.exports = itemSchema;

私のプログラムファイルでは、次のようにします。

var itemSchema = require('../w8/W8DBItemSchema.js'); 
...

var W8DBItem = db.model('W8DBItem', itemSchema);
var newWeightItem = W8DBItem(aWeight);
...

チャームのように機能します。これが誰かに役立つことを願っています!

0
Tom D.

投稿された回答は問題を解決しません。残念ながら、データベースをアップグレードするだけでは不十分なので、それは私にとっても解決策ではありません。しかし、ここで私はこの問題の解決策を見つけました: https://github.com/Automattic/mongoose/issues/4064

次のように、.$__saveの代わりに.saveを使用してください。

var b = new BookModel({title : 'aaaaaa'});

b.$__save({}, function(e){ 
  if(e){
    console.log('error')
    // callback will show if e exists
  }else{
    console.log('no error')
    // callback will show 'no error'
}});
0
ttemple