【发布时间】:2017-01-10 02:01:05
【问题描述】:
我是一个 nodejs 初学者,我遇到了一些我不理解的回调行为。我正在使用 Express 路由器使用 POST 请求将 Mongoose 对象写入 Mongodb。在请求的正文中,我传递了一个包含两个字段的嵌套 json 结构 - jobDetails 和 examples。 jobDetails 中的数据用于创建Job Mongoose 对象,examples 中的数据用于创建多个Example Mongoose 对象。 Job 和 Example 对象链接在一起,Job 在其中一个字段中包含Example 对象的列表。
我尝试实现这一点的方式是通过以下方式使用回调。基本上,我首先将Job 对象保存到mongo,然后遍历示例——每次创建一个Example 对象并通过.job 字段将其链接到作业,并将Example 对象保存到mongo。然后在Example对象保存函数的回调中,我用新的Example对象更新了Job对象,并将更新后的版本保存到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);
});
}
});
这并没有像我预期的那样执行。具体来说,实际上将两倍数量的示例保存到 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){
console.log(err);
});
job.examples.push(eg);
job.save(function(err,job){
console.log(err);
});
}
});
我也不确定这是否是最佳解决方案。但我想知道为什么我原来的方法会导致意外行为。
【问题讨论】:
标签: node.js mongodb express mongoose callback