0

How can I make callback and variables so that I can save data to my database?

I have node app.post like below. I need to convert form data to mongoose model. The data what I'm getting is in two arrays and only data which has amount larger than 0 is searched and saved, but this don't work and I can't get around it.

I think that looping and searching for ingredients should be a function and Meal.save should be in callback but I don't know how. I've been banging my head into this problem for weeks and I have googled, but this just does not open to me. Please help me with this.

Thanks in advance!

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 what I get from the above is here:

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: [] }
Damii
  • 13
  • 4

1 Answers1

0

You can check this stackoverflow answer for getting records respective to ids. 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);

      });
});
Kaps
  • 189
  • 7