猫鼬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

最佳答案

我认为您不能以这种方式使用Q。

Q()将传递给它的任何东西变成承诺。当您以自己的方式传递函数调用时,实际上就是传递了该函数的返回值。换句话说,就像Q(3)可以解析为3一样,Q(nodefunc(args))可以解析为nodefunc(args)返回的值-对于异步函数而言,它不是特别重要。

我想您想改用ninvoke(又称nsend)。


  Q.ninvoke(对象,方法名,...参数)
  
  别名:Q.nsend
  
  使用给定的可变参数调用Node.js样式的方法,
  如果该方法以
  结果,如果返回错误(或抛出一个错误)则被拒绝
  同步)。


猫鼬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);
    });
}


(未经测试的代码)

07-24 09:16