2017-12-31 290 views
0

Mongooseを使用してMongoDBにデータを追加しようとしていますが、そのデータをデータベースに保存できません。私はthisのチュートリアル(〜11分)に従っていますが、動画はMongooseの別のバージョンを使用している可能性があります。MongooseでシードされたデータがMongoDBに保存されていません

基本的に、私は別のJSファイルで定義されたProductスキーマを持っていて、Mongoデーモンを実行している端末でnode productSeeder.jsを実行してproductSeeder.jsというファイルを実行しています。私が正しいデータベースに切り替えてをMongoシェルに入力すると、何も私に返されません。

私productSeeder.jsファイル:

var Product = require('../models/product'); 
var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost:27017/shopping'); 

var products = [ 
    new Product({ 
     imagePath: 'images/dummy.png', 
     price: 9, 
     title: 'a title', 
     desc: 'some text' 
    }), 
    new Product({ 
     imagePath: 'images/dummy.png', 
     price: 5, 
     title: 'a title', 
     desc: 'some text' 
    }) 
]; 

var done = 0; 
for (var i = 0; i < products.length; i++) { 
    products[i].save(function(err, result) { 
     if (err) { 
      console.log(err); 
      return; 
     }; 

     done++; 
     if (done == products.length) { 
      mongoose.disconnect(); 
     }; 
    }); 
}; 

マイproduct.jsファイル:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var schema = new Schema({ 
    imagePath: {type: String, required: true}, 
    price: {type: Number, required: true}, 
    title: {type: String, required: true}, 
    desc: {type: String, required: true} 
}); 

module.exports = mongoose.model('Product', schema); 

本当にありがとうございました、と幸せな休日!

+0

コンソールにエラーはありませんか? console.logを使用してみましたか、保存コールバックによって返された結果値をデバッグしましたか?それには何が含まれていますか? – SunriseM

+0

エラーはありません。私は結果を印刷しようとしました、それは正しい製品を印刷します。 – gridproquo

+0

'if done'内でProduct.find({}、function(err、products){console.log(products.length)})を自分のコードに追加しました。何らかの理由で、ファイル全体を実行するたびに長さが増えます。つまり、実際にデータが保存されていますか?データがMongoDBシェルで私に返されないという理由がありますか? – gridproquo

答えて

-1

クイックルック

まず、iffeで保存コマンドをラップする必要があります。このようなもの

for (var i = 0; i < products.length; i++) { 
    (function (result) { 
     products[i].save(function(err, result) { 
      if (err) { 
       console.log(err); 
       return; 
      }; 

      done++; 
      if (done == products.length) { 
       mongoose.disconnect(); 
      }; 
     });  
    })(result);  
}; 
+0

これは "結果が定義されていません"を投げるでしょう、多分あなたは "私"を渡すことを意味するが、彼はコールバックの中でそれを使用していないので、私はその使用を見ません。 – SunriseM

+0

あなたは正しいと思いますが、私は使用しませんでした – pkpk

0

製品を保存する前にMongooseが正常に接続されているかどうか知りませんか?

Dbアクセスが非同期であるため、接続が存在する前にアイテムを保存しようとしている可能性があります。

接続にコールバックを渡すか、イベントリスナーを使用して、接続コールバックで保存関数をラップすることができます。

mongoose.connection.on('connected', function(){ 
    //save products here 
}); 

私はいくつかのモンゴースの例を誤りなく保存することができませんでした。

編集:.on('open')の代わりに(mongoose docs)を聞く方が良いかもしれません。

+0

ちょうど試みましたが、残念ながらうまくいきませんでした:( – gridproquo

+0

'mongo'シェルに' use shopping'と 'show collections'と入力すると、 'products'コレクション?使用しているMongooseモデルコードを投稿できますか?YouTubeビデオに関連付けられたレポでは見つかりませんでした – thmsdnnr

+0

元の投稿をモデルコードで更新しました。 – gridproquo