猫鼬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);
});
}
(未经测试的代码)