2016-04-07 18 views
2

私はNode.jsとMongooseを初めて使用しており、何か助けが必要です。だから私はまずbeerObjectsという配列を作成します。次に、私はbreweryDBに要求を出し、この配列に情報を格納します。Nodejs/Mongooseは、変数をmongoose関数に渡します。

request(options, function (error, response, body) { 
      if (error) throw new Error(error); 
      obj = JSON.parse(body); 
      data = obj['data']; 
      for(i = 0; i < data.length; i++) { 
       var newBeer = new Beer(); 
       newBeer.id = data[i]['id']; 
       newBeer.name = data[i]['name']; 
       newBeer.description = data[i]['description']; 
       newBeer.abv = data[i]['abv']; 
       if (data[i].hasOwnProperty('labels')) { 
        newBeer.image = data[i]['labels']['large']; 
       } 

       beerObjects.push(newBeer); 
       console.log(beerObjects[i].name); 
      } 
      addBeersToDatabase(beerObjects); 
     }); 

私はこの配列をとり、mongoデータベースに情報を格納する別の機能を持っています。

addBeerToDatabase()関数の先頭に
function addBeersToDatabase(beerObjects) { 
console.log(beerObjects.length); 
for (i = 0; i < beerObjects.length; i++) { 
    console.log(beerObjects[i].id); 
    // check if beer is already in database 
    Beer.count({id: beerObjects[i].id}, function(err, count){ 
     if (err) { 
      handleError(err); 
     } 
     if (count == 0) { 
      // add new beer to database 
      var newBeer = new Beer(); 
      newBeer.id = beerObjects[i].id; 
      newBeer.name = beerObjects[i].name; 
      newBeer.description = beerObjects[i].description; 
      newBeer.abv = beerObjects[i].abv; 
      newBeer.image = beerObjects[i].image; 

      newBeer.save(function(err) { 
       if (err) { 
        throw err; 
       } 
      }); 

     } 
     else { 
      // beer is already in database 
     } 
    }); 
} 

}

、beerObjectが定義されているとはconsole.log()ステートメントの出力正しい情報。しかし、Mongoose関数Beer.count()の中で、私はこのエラーメッセージを受け取ります。

newBeer.id = beerObjects[i].id; 
TypeError: Cannot read property 'id' of undefined 

この 'id'は、newBeerではなくbeerObjects [i]のIDです。どのように正しくmongoose関数にbeerObjectsを渡して、その関数で使うのですか?

EDIT:

function addBeersToDatabase(beerObjects) { 
for (i = 0; i < beerObjects.length; i++) { 
    console.log(beerObjects[i].beerId); 
    var currentBeer = beerObjects[i]; 

    // check if beer is already in database 
    Beer.findOne({'beerId': currentBeer.beerId}, function(err, beer){ 
     if (err) { 
      handleError(err); 
     } 
     if (beer) { 
      // beer is already in database 
     } 
     else { 
      // add new beer to database 
      console.log(currentBeer.name); 
      saveNewBeer(currentBeer); 
     } 
    }); 
} 

}

function saveNewBeer(currentBeer) { 
var newBeer = new Beer(); 
newBeer.beerId = currentBeer.beerId; 
newBeer.name = currentBeer.name; 
newBeer.description = currentBeer.description; 
newBeer.abv = currentBeer.abv; 
newBeer.image = currentBeer.image; 

newBeer.save(function(err) { 
    if (err) { 
     throw err; 
    } 
}); 

}

このコードはbeerObjectsわずか最後の項目のn個の複製(N = beerObjects.length)を添加します。

+0

'i'変数はスコープの外に定義されていますので、ローカル変数を使用するか、関数内の' id'をストアしてください。var: 'var id = beerObjects [i] .id;' – alexmac

答えて

1

編集あなたは別の範囲にあるnewBeer.idの設定に落ちます。そのような

for (i = 0; i < beerObjects.length; i++) { 
    console.log(beerObjects[i].id); 
    var checkBeer = beerObjects[i] 
    // check if beer is already in database 
    Beer.count({id: checkBeer.id}, function(err, count){ 
     if (err) { 
      handleError(err); 
     } 
     if (count == 0) { 
      // add new beer to database 
      var newBeer = new Beer(); 
      newBeer.id = checkBeer.id; 
... and so on 
+0

他の答えと同じです。まだ動作しません。私はビールのIDである「id」というフィールドを作りました。 '_id'は違う、それはmongodb idだ。それはnewBeerの問題ではありません。ビールオブジェクトの問題です。 – patels326

+0

はい、これは私の元の問題を解決しましたが、もう別の問題があります。リストの最後のビールだけが自分のデータベースに追加されています。リストの長さが10であるとしましょう。同じビールをデータベースに10枚追加しています。 – patels326

+0

私は今findOneを使用していますが、まだ動作していません。 idの代わりに名前にマッチさせてみましたが、まだ重複を追加しています。そして、forループは、最後のビールだけで何度か繰り返しています。 – patels326

1

あなたはIDの代わりに_id使用する必要があります、そして、あなたが非同期的に時間をあなたによって、カウント数を確認し

あなたはをループしてbeerObject[i].idでビールを「つかむ」されています

newBeer._id = data[i]['id']; 
newBeer.name = data[i]['name']; 
+0

まだ動作しません。私はビールのIDである「id」というフィールドを作りました。 '_id'は違う、それはmongodb idだ。それはnewBeerの問題ではありません。ビールオブジェクトの問題です。 – patels326

1

MongoDBのIDが自動生成されたので、あなたがすることはできませんで、これに救済策はbeerObject[i].idに変数を設定し、Beer.countで検索「ビール」としてそれを渡すことですあなたのマングースモデルで_idをStringとして定義していない限り、_idプロパティに値を追加しました。

たとえば、あなたの関数内

var mongoose = require('mongoose'); 
var beerSchema = new mongoose.Schema({ 
    _id: String, 
    name: String, 
    // rest of beer properties 
}); 

module.exports = mongoose.model('Beer', beerSchema); 

function addBeersToDatabase(beerObjects) { 
    for (i = 0; i < beerObjects.length; i++) { 
    Beer.findbyId(beerObjects[i].id, function(err, beers){ 
     if (beers.lenght == 0) { 
      // add new beer to database 
      var newBeer = new Beer(); 
      newBeer._id = beerObjects[i].id; 
      newBeer.name = beerObjects[i].name; 
      newBeer.description = beerObjects[i].description; 
      newBeer.abv = beerObjects[i].abv; 
      newBeer.image = beerObjects[i].image; 
      newBeer.save(); 
     } 
     else { 
      // beer is already in database 
     } 
    }); 
} 

デフォルトのmongoIdを使用したい場合、あなたは自分の関数から、モデルとnewBeer._id = beerObjects[i]id_id: Stringを削除する必要があります。これがあなたに役立つことを願っています。

関連する問題