i nodejs beginner , ran callback behaviour don't understand. using express router write mongoose objects mongodb using post request. in body of request passing in nested json structure 2 fields - jobdetails
, examples
. data in jobdetails
used create job
mongoose object , data in examples
used create several example
mongoose objects. job
, example
objects linked in job
contains list of example
objects in 1 of it's fields.
the way tried implement callbacks in following way. save job
object mongo first, iterate on examples - each time creating example
object , linking job via .job
field , saving example
object mongo. in callback example
object save function updated job
object new example
object , saved updated version mongo.
router.post('/jobs', function (req, res, next) { var job = new job(req.body.jobdetails); var examples = req.body.examples; console.log("job details"); console.log(req.body.jobdetails); console.log("examples"); console.log(req.body.examples); //save job job.save(function (err, job) { console.log(err); }); //save examples for(i=0; i<examples.length;i++){ var eg = new example({content: examples[i]}); eg.job=job; eg.save(function (err, eg){ job.examples.push(eg); job.save(function(err, job){ console.log(err); }); console.log(err); }); } });
this did not perform expect. specifically, double number of examples saved mongo several duplicates , missing. understand callbacks asynchronous me still doesn't explain why double number of examples saved , duplicated , missing.
i got work correctly without using callbacks @ in following way.
router.post('/jobs', function (req, res, next) { var job = new job(req.body.jobdetails); var examples = req.body.examples; console.log("job details"); console.log(req.body.jobdetails); console.log("examples"); console.log(req.body.examples); //save job job.save(function (err, job) { console.log(err); }); //save examples for(i=0; i<examples.length;i++){ var eg = new example({content: examples[i]}); eg.job=job; eg.save(function (err, eg){ console.log(err); }); job.examples.push(eg); job.save(function(err,job){ console.log(err); }); } });
and i'm not sure if optimal solution either. know why original approach resulted in unintended behaviour.
this should work..
router.post('/jobs', function(req, res, next) { var job = new job(req.body.jobdetails); var examples = req.body.examples; console.log("job details"); console.log(req.body.jobdetails); console.log("examples"); console.log(req.body.examples); //save job job.save(function(err, result) { if (!err) { //save examples (i = 0; < examples.length; i++) { var eg = new example({ content: examples[i] }); eg.job = job; eg.save(function(err, eg) { job.examples.push(eg); job.save(function(err, job) { if (!err) job.examples = []; }); console.log(err); }); } } }); });
Comments
Post a Comment