【问题标题】:dropCollection isn't dropping the collectiondropCollection 没有删除集合
【发布时间】:2015-08-17 23:48:09
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js mongodb mongoose q


    【解决方案1】:

    我认为你不能这样使用 Q。

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

    我想你想改用ninvoke(又名nsend)。

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

    别名:Q.nsend

    使用给定的可变参数调用 Node.js 风格的方法, 如果方法用 a 回调,则返回一个已履行的承诺 结果,或者如果它以错误回调(或抛出一个 同步)。

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

    (未经测试的代码)

    【讨论】:

    • connection 未定义。如果你在那里使用mongoose.connection.db 而不是connection.db,它可以正常工作
    • @Houseman 啊,我明白了。 mongoose.connect 是一个同步函数(不知道,我对猫鼬做的不多)。在这种情况下,您根本不需要承诺它(除非您想使用 Q 的 .catch())。
    【解决方案2】:

    我认为你误解了 mongoose、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 方法,因此您需要对其进行去节点化。

    【讨论】:

      猜你喜欢
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多