2017-07-29 2 views
0

データベースにデータを保存できるようにコールバックと変数を作成するにはどうすればよいですか?ノードで非同期コールバックを作成し、HTMLフォームデータをdbに保存する方法

私は以下のようにノードapp.postを持っています。フォームデータをmongooseモデルに変換する必要があります。私が得ているデータは2つの配列にあり、量が0より大きいデータのみが検索され保存されますが、これはうまくいかず、回避できません。

私は食材のルーピングと検索は関数でなければならず、Meal.saveはコールバックでなければならないと思います。私は何週間もこの問題に頭を抱えていて、私はグーグルではありましたが、これは私には開かれません。これで私を助けてください。

ありがとうございます!

app.js

app.post("/diary/:id/dayshow", function(req, res) { 

// Get the day I want to save my meal data 
    Day.findById(req.params.id, function(err, day) { 
    if (err) { 
     console.log(err); 
     res.redirect("/diary"); 
    } else { 

// This is the format I have in the mongoose model 
// and I need to convert HTML form data to this 

     var singleMeal = 
      { 
      //  title: dinner 
      //  ingredients: [ 
      //      { 
      //      ingredient:{}, 
      //      amount: Number 
      //      } 
      //     ] 
      } 
     var singleMealTempArr = []; 
     var singleIngredientObj = {}; 
     var amount; 
     singleMeal.title = req.body.title; 

// Looping through the HTML form data and converting it to mongoose model 
// I want to loop data and search mongo first and after that I need to save 
// the data to mongo which happens in Meal.save() 

     for (var i = 0; i < req.body.amount.length; i++) { 
      var _id = req.body.id[i]; 
      amount = Number(req.body.amount[i]); 
      if (amount !== 0) { 
      singleIngredientObj.amount = amount; 

// Searching ingredient from database with ID what is from the HTML form 

      Ingredient.findById({_id}, function(err, foundIngredientData){ 
       console.log(foundIngredientData + "<<<<<<<<<<<<< ingredientData"); 
       singleIngredientObj.ingredient = foundIngredientData; 
       singleMealTempArr.push(singleIngredientObj); 
       console.log(JSON.stringify(singleMealTempArr) + "<<<<<<<<<<<< JSON.stringify(singleMealTempArr)"); 
      }); 
      } 
     } 
     singleMeal.ingredients = singleMealTempArr; 

// Now I should have data in singleMeal variable, but it has only title and 
// empty array of ingredients 
     console.log("JSON.stringify(singleMeal) >>>>>>>>>" + JSON.stringify(singleMeal) + "<<<<< JSON.stringify(singleMeal)"); 
     } 

     Meal.create(singleMeal, function(err, singleMealObject) { 
     if (err) { 
      console.log(err); 
     } else { 
     console.log("--- You hit the Meal.create + Save -----" + "singleMealObject: " + singleMealObject); 
     // day.meals.push(singleMealObject); <-- These two are commented because previous steps dont work and singleMealObject has only title and empty array of ingredients 
     // day.save(); 

      res.redirect("/diary/" + day._id + "/dayshow"); 
     } 
     }); 
    }); 
}); 

console.logs私が上から取得することはここにある:

JSON.stringify(singleMeal) >>>>>>>>>{"title":"aa","ingredients":[]} <<<<< JSON.stringify(singleMeal) 

{ _id: 597c11c04a7bce08cdcdef41, 
    name: 'oatmeal', 
    kcal: 100, 
    protein: 2, 
    carb: 50, 
    fat: 1, 
    addinfo: '', 
    __v: 0 } <<<<<<<<<<<<< ingredientData 

[{"amount":3,"ingredient":{"_id":"597c11c04a7bce08cdcdef41","name":"oatmeal","kcal":100,"protein":2,"carb":50,"fat":1,"addinfo":"","__v":0}}] <<<<<<<<<<<< JSON.stringify(singleMealTempArr) 

{ _id: 597c11c04a7bce08cdcdef41, 
    name: 'oatmeal', 
    kcal: 100, 
    protein: 2, 
    carb: 50, 
    fat: 1, 
    addinfo: '', 
    __v: 0 } <<<<<<<<<<<<< ingredientData 

[{"amount":3,"ingredient":{"_id":"597c11c04a7bce08cdcdef41","name":"oatmeal","kcal":100,"protein":2,"carb":50,"fat":1,"addinfo":"","__v":0}},{"amount":3,"ingredient":{"_id":"597c11c04a7bce08cdcdef41","name":"oatmeal","kcal":100,"protein":2,"carb":50,"fat":1,"addinfo":"","__v":0}}]<<<<<<<<<<<< JSON.stringify(singleMealTempArr) 

--- You hit the Meal.create + Save -----singleMealObject: { __v: 0, 
    title: 'aa', 
    _id: 597c11cb4a7bce08cdcdef61, 
    ingredients: [] } 

答えて

0

あなたはIDSへの各レコードを取得するため、このstackoverflowの答えを確認することができます。 mongodb/mongoose findMany - find all documents with IDs listed in array

app.post("/diary/:id/dayshow", function(req, res) { 

// Get the day I want to save my meal data 
    Day.findById(req.params.id, function(err, day) { 
    if (err) { 
     console.log(err); 
     res.redirect("/diary"); 
    } else { 

// This is the format I have in the mongoose model 
// and I need to convert HTML form data to this 

     var singleMeal = 
      { 
      //  title: dinner 
      //  ingredients: [ 
      //      { 
      //      ingredient:{}, 
      //      amount: Number 
      //      } 
      //     ] 
      } 
     var singleMealTempArr = []; 
     var amount; 
     singleMeal.title = req.body.title; 


     function generateMeal(callback) { 

      var meal_ids = []; 
      for (var i = 0; i < req.body.amount.length; i++) { 
        var singleIngredientObj = {}; 
        var _id = req.body.id[i]; 
        amount = Number(req.body.amount[i]); 
        if (amount !== 0) { 
        meal_ids.push(_id); 
        singleIngredientObj.amount = amount; 
        singleMealTempArr.push(singleIngredientObj); 
        } 

      } 

      Ingredient.find({_id : meal_ids}, function(err, getIngredientsOfIds){ 
       // not added amount. you can do it data massage whatever you want 
        if(err) { 
        //error handling 
        return; 
        } 
        for(var i = 0; i < singleMealTempArr.length; i++) { 
        singleMealTempArr[i].ingredients = getIngredientsOfIds[i]; 
        } 
        singleMeal.ingredients = singleMealTempArr; 
        callback(); 
      }); 

     } 



     function createMeal() { 
      Meal.create(singleMeal, function(err, singleMealObject) { 
       if (err) { 
        console.log(err); 
       } else { 
       console.log("--- You hit the Meal.create + Save -----" + "singleMealObject: " + singleMealObject); 
       // day.meals.push(singleMealObject); <-- These two are commented because previous steps dont work and singleMealObject has only title and empty array of ingredients 
       // day.save(); 

        res.redirect("/diary/" + day._id + "/dayshow"); 
       } 
       }); 
     } 

     generateMeal(createMeal); 

     }); 
}); 
+0

私も、私は、同時に複数のIDを検索することができると考えてdid't。私はこれがうまくいくかどうかを知らせます。このチップをありがとう。 – Damii

+0

私が回答で追加したリンクをチェックする – Kaps

関連する問題