我试图使用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
答案 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);
});
}
(未经测试的代码)