MongoDB table ES6 没有保存记录 Promise.ALL
MongoDB table records are not getting persisted with ES6 Promise.ALL
我是 MongoDB 的新手,正在编写小教程以在 MongoDB 中的 table 之间创建关联。
根据教程,我们需要在三个 table 之间创建关联。
1. 用户 table
2. 博文 table
3.评论table
用户可能有多个博文,一个博文可能有评论列表,评论也与用户对应。
用户 -> 博文 -> 评论
我编写了以下测试用例来创建三个记录并测试关联:
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”功能时仅创建了 "user" table。 我在上面的代码片段中注释掉了"Promise.All",并一一保存了三个记录。
下图显示了测试用例执行的结果:
下图显示了 RoboMongo 工具的快照,其中仅存在 "user" table:
更新:我还创建了另一个测试用例文件 "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 了解更多详情。
我认为您的问题与您的 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()
]);
});
我是 MongoDB 的新手,正在编写小教程以在 MongoDB 中的 table 之间创建关联。
根据教程,我们需要在三个 table 之间创建关联。 1. 用户 table 2. 博文 table 3.评论table
用户可能有多个博文,一个博文可能有评论列表,评论也与用户对应。
用户 -> 博文 -> 评论
我编写了以下测试用例来创建三个记录并测试关联:
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”功能时仅创建了 "user" table。 我在上面的代码片段中注释掉了"Promise.All",并一一保存了三个记录。
下图显示了测试用例执行的结果:
下图显示了 RoboMongo 工具的快照,其中仅存在 "user" table:
更新:我还创建了另一个测试用例文件 "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 了解更多详情。
我认为您的问题与您的 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()
]);
});