我是MongoDB的新手,正在开发小型教程,以便在MongoDB中创建表之间的关联。
根据教程,我们需要在三个表之间创建关联。 1.用户表 2. BlogPost表 3.评论表
用户可能有多个博客帖子,博客帖子可能有评论列表,评论也会映射到用户。
用户 - > BlogPost - >评论
我编写了以下测试用例来创建三个记录并测试关联:
const assert = require('assert');
const User = require('../src/users');
const BlogPost = require('../src/blogPost');
const Comment = require('../src/comment');
describe('Association', () => {
let ascUer, blogPost, comment;
beforeEach( (done) => {
ascUer = new User({name:'associationUser'});
blogPost = new BlogPost({title:'JS is great',content:'Yep, It is !!'});
comment = new Comment({content:'Congratulation for the great poost !!!'});
ascUer.blogPosts.push(blogPost);
blogPost.comments.push(comment);
comment.user = ascUer;
/*
// THIS IS NOT WORKING
Promise.all([ascUer.save(),blogPost.save(),comment.save()])
.then(() => done());
*/
ascUer.save()
.then(() => {
console.log('***********Association user saved ***************');
blogPost.save()
.then(() => {
console.log('***********Blogpost saved ***************');
comment.save()
.then(() => {
console.log('***********Comment saved ***************');
done();
});
});
});
});
it.only('Saves a relation between a user and a blogpost', (done) => {
User.findOne({name:'associationUser'})
.populate('blogPosts')
.then((user) => {
console.log(user);
done();
});
});
});
在mocha和nodeJs的帮助下运行测试用例时,我面临着奇怪的行为。测试用例已成功执行,但在使用ES6的“ Promise.All ”功能时仅创建了“用户”表。 我在上面的代码段中注释掉了“Promise.All”并逐一保存了三条记录。
下图显示了RoboMongo工具的快照,其中只有“user”表存在:
更新:我还创建了另一个测试用例文件“connection_helper.js”,其中我编写了“beforeEach”块以建立数据库连接并在执行任何测试用例之前删除所有模式。
以下是用“connection_helper”js文件编写的代码:
const mongoose = require('mongoose');
let isSchemaDropped = false;
mongoose.Promise = global.Promise;
before((done) => {
mongoose.connect('mongodb://localhost:27017/users_test');
mongoose.connection
.once('open', () => {
console.log('Connected to Mongose DB !!');
done();
})
.on('error', (error) => {
console.warn('Error while connecting to Mongose DB !!',error);
});
});
beforeEach((done) => {
if(!isSchemaDropped){
isSchemaDropped = true;
console.log("Dropping database schema !!!");
try{
const {users,comments,blogposts,employees} = mongoose.connection.collections;
users.drop(() => {
comments.drop(() => {
blogposts.drop(() => {
employees.drop(() => {
console.log("**********************************************");
console.log("**********************************************");
console.log("******Dropped All Schema******");
console.log("**********************************************");
console.log("**********************************************");
});
});
});
});
}catch(e){
console.log(e);
}
}else{
//console.log("Database schema is already dropped before !!!");
}
done();
});
为什么ES6“Promise.All”在我的系统中无法正常工作?任何建议赞赏。您也可以通过GitHub引用我的代码:https://github.com/shahgunjan07/MongoDBTutorial.git以获取更多详细信息。
答案 0 :(得分:1)
我认为您的问题与您的beforeEach
有关,在继续测试之前,它并没有正确等待删除所有收藏品。这可能导致在测试运行时删除集合,从而导致意外行为。
这是另一种实现方式:
beforeEach(() => {
if (isSchemaDropped) return;
isSchemaDropped = true;
console.log("Dropping database schema !!!");
const {
users,
comments,
blogposts,
employees
} = mongoose.connection.collections;
return Promise.all([
users.drop(),
comments.drop(),
blogposts.drop(),
employees.drop()
]);
});