我正在尝试使用objectID来使用一对多关系来播种MongoDB数据库。如下所示:
var postSchema = mongoose.Schema({
name: {type: String, required: true, unique: true},
description: {type: String},
userlikes: [{type: mongoose.Schema.Types.ObjectId, ref: 'Users'}]
});
这种同步实现看起来像这样(伪代码):
openConnection()
cleardb()
users = createUsers()
post = createPost(users)
使用Node我需要嵌套这些调用中的每一个都会变得混乱并且难以重复使用对象(我可能希望在之后创建更多的依赖对象)。我已经看过异步,但在这种情况下看起来并没有太多帮助 - 我可以使用async.waterfall,但这会给我类似于嵌套解决方案的东西,只能扁平化为数组。
当播种相关数据时,如果您可以创建数据对象然后假设它们存在用于构建后续数据结构,则显然会有所帮助。显然,使用异步方法并不会发生这种情况。我错过了这里的观点吗?
我认为,对于API而言,如此广泛地使用节点这对于设置测试数据是一个常见的挑战,但我无法在任何地方找到优雅的解决方案。
有人能指出我在节点设置中如何解决这个问题的示例实现吗?
答案 0 :(得分:1)
使用async可能非常方便 一天结束时所有业务逻辑/任务只是一系列操作。瀑布是一种对您的解决方案非常有用的抽象。
例如:seed.js
var User = require('../path/to/your/models/User');
var Post = require('../path/to/your/models/Post');
var DB = require('../path/to/your/database/boot/module');
var config = require('../path/to/your/configuration');
function startDB(config, callback) {
DB.start(config, callback);
}
function createUsers(userParams, callback) {
User.save(userParams, callback);
}
function createPost(users, callback) {
Post.save(users, callback);
}
function resolvedCallback(err, posts) {
if (err)
return your-error-handling-here;
console.log(posts);
DB.cleanup(console.log.bind(null, 'clean up finished: '));
}
async.waterfall([
async.constant({ db: config.dbOpts}),
startDB, // we don't need the wrapper, we could use DB.start
createUsers,
createPost ], resolvedCallback);
如果您正在使用某个测试框架(mocha / tape),您可以在开始之前/之后的所有测试和清理之前初始化数据库。
欢呼声