【发布时间】:2017-12-19 00:19:53
【问题描述】:
import Student from './api/user/student.model';
import Class from './api/user/class.model';
import User from './api/user/user.model';
import request from 'request';
import async from 'async';
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter;
function seedDb() {
Student.remove({}, (err, data) => {
Class.remove({}, (err, data1) => {
User.remove({}, (err, data2) => {
User.create({
email: 'admin@example.com',
password: 'admin'
}, (err, data3) => {
User.findOne({
email: 'admin@example.com'
}, (err, foundUser) => {
foundUser.save((err, done) => {
let url = 'https://gist.githubusercontent.com/relentless-coder/b7d74a9726bff8b281ace936757953e5/raw/6af59b527e07ad3a589625143fb314bad21d4f8e/dummydata.json';
let options = {
url: url,
json: true
}
request(options, (err, res, body) => {
if (!err && body) {
let classId;
async.forEachOf(body, (el, i) => {
console.log(i);
if (i % 4 === 0) {
async.waterfall([(fn) => {
Student.create(el, (err, success) => {
fn(null, success._id);
})
}, (id, fn) => {
console.log('The class creation function is called');
Class.create({name: `Class ${i}`}, (err, newClass)=>{
classId = newClass._id;
newClass.students.push(id);
newClass.save()
fn(null, 'done');
})
}])
} else {
async.waterfall([(fn) => {
Student.create(el, (err, success) => {
fn(null, success._id)
})
}, (id, fn) => {
console.log('Class find function is called and classId', id, classId)
Class.findById(classId, (err, foundClass) => {
console.log(foundClass)
foundClass.students.push(id);
foundClass.save();
fn(null, 'done');
})
}])
}
})
}
});
})
});
})
})
})
})
}
我想要做的是,我有 20 个学生的样本数据。我必须将分布在 5 个班级的 20 名学生作为我的数据库的种子,每个班级有 4 名学生。
阻止我实现这一目标的是某些迭代,classId 的值是undefined。
谁能帮我解决这个问题?
【问题讨论】:
-
你为什么要这么做?相反,您应该简单地将
fn作为“回调”参数提供给 mongoose 方法,就像在(fn) => Student.create(el,fn), (success,fn) => // address as success._id here中一样。您正在包装不需要包装的东西。坦率地说,瀑布“之前”的代码在这里更令人担忧。您的回调用法可以被清除,甚至这里使用asyncjs有点“老帽子”,可以很容易地用 Promise 来处理。但这里的查询数量也是惊人的,你的建模确实可以做一些工作。 -
您能解释一下方法吗?您的评论对我应该使用什么其他方法并没有真正的帮助。
标签: node.js mongodb mongoose async.js