dropCollection不会删除集合

时间:2015-06-03 16:25:16

标签: javascript node.js mongodb mongoose q

猫鼬4.0.3
节点0.10.22
mongod db 3.0.1版

我试图使用moongoose删除一个集合,但它不起作用

run: function() {
    return Q(mongoose.connect('mongodb://127.0.0.1:27017/test',opts))
    .then(function(data){
        return Q(mongoose.connection.db.dropCollection('departments'))
        .then(function(data2){
            console.log('data2 is ',data2);
            return Q(true);
        }).catch(function(err){
            console.log('err is',err);
            return Q(false);
        });
    }).catch(function(err){
        console.log('err is', err);
        return Q(false);
    });
}

这会返回data2 is undefined

我尝试根据这个问题来回答:Mongoose.js: remove collection or DB

2 个答案:

答案 0 :(得分:1)

我认为你误解了猫鼬,db和Q可以互动的方式。

你可以试试(未经测试)

run: function() {
  return Q(mongoose.connect('mongodb://127.0.0.1:27017/test',opts).exec())
  .then(function(){
    var db = mongoose.connection.db;
    var drop = Q.nbind(db.dropCollection, db);
    return drop('departments')
           .then(function(data2){
             console.log('data2 is ',data2);
             return true;
            }).catch(function(err){
             console.log('err is',err);
             return false;
             });
}).catch(function(err){
    console.log('err is', err);
    return false;
});

}

需要使用exec()调用mongoose函数才能返回Promise。

据我所知,这不会扩展到dropCollection方法,所以你需要对它进行去节点化。

答案 1 :(得分:1)

我认为你不能用这种方式使用Q.

Q()将你传递给它的任何东西变成一个承诺。当您按照您的方式传入函数调用时,您可以有效地传入该函数的返回值。换句话说,就像Q(3)将解析为3一样,Q(nodefunc(args))将解析为nodefunc(args)返回的任何内容 - 并且在异步函数不是特别多的情况下。< / p>

我想您想要使用ninvoke(a.k.a。nsend)。

  

Q.ninvoke(object,methodName,... args)

     

别名:Q.nsend

     

使用给定的可变参数调用Node.js样式方法,   如果方法使用a回调,则返回已履行的promise   结果,如果它回调错误(或抛出一个错误),则拒绝   同步地)。

mongoose API文档说connect是一个不返回任何内容的同步方法。它的近亲createConnection将返回一个连接对象,可能更适合用例。

以下代码同时具有 - 对于返回实际值的同步方法调用Q,以及对使用回调的异步方法调用Q.nsend

run: function() {
    return Q(mongoose.createConnection('mongodb://127.0.0.1:27017/test', opts))
    .then(function(connection){
        return Q.nsend(connection.db, 'dropCollection', 'departments')
        .then(function(data){
            console.log('data is ', data);
            return data;
        });
    }).catch(function(err){
        console.log('err is', err);
    });
}

(未经测试的代码)