使用ES6 Promise.ALL

时间:2017-05-20 09:07:44

标签: node.js mongodb mongoose es6-promise robo3t

我是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”并逐一保存了三条记录。

下图显示了测试用例执行的结果: enter image description here

下图显示了RoboMongo工具的快照,其中只有“user”表存在: enter image description here

更新:我还创建了另一个测试用例文件“connection_helper.js”,其中我编写了“beforeEach”块以建立数据库连接并在执行任何测试用例之前删除所有模式。

下图显示了项目目录结构: enter image description here

以下是用“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以获取更多详细信息。

1 个答案:

答案 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()
  ]);
});