我需要在node.js中使用mongoose返回查询结果。
如何返回值以将值设置为变量?
我需要做的是:
var results = users.findOne({_id : users_list[i]['user_id']},{email : 1, credits : 1},{}, function(err, docs) {
if( err || !docs) {
console.log("No user found");
} else {
return docs;
};
});
为了拥有:
results = docs
非常感谢您的回复。
我还有另一个问题。
如何使用find或findOne在查询运算符中传递变量?喜欢:
var foo = "Blaa";
users.findOne({_id : users_list[i]['user_id']},{email : 1, credits : 1},{}, function(err, docs) {
if( err || !docs) {
console.log("No user found");
} else {
// I want to use the foo variable here
console.log(foo);
};
});
答案 0 :(得分:64)
有几种方法可以达到你想要的效果。
<强> 1。使用Mongoose查询
在此策略中,您的函数返回一个Mongoose查询,稍后您可以使用该查询来调用方法exec
并使用它来获取结果。
function getJedisQuery(name){
var query = Jedi.find({name:name});
return query;
}
然后你可以简单地使用它:
var query = getJedisQuery('Obi-wan');
query.exec(function(err,jedis){
if(err)
return console.log(err);
jedis.forEach(function(jedi){
console.log(jedi.name);
});
});
<强> 2。使用像Mongoose Promise一样的对象
Moogose为类似承诺的对象提供支持。您所要做的就是与我上面所做的有些相似,但这一次,您在没有回调的情况下调用exec
方法。
function getJedisPromise(name){
var promise = Jedi.find({name:name}).exec();
return promise;
}
然后您只需执行以下操作即可使用它:
var promise = getJedisPromise('Luke');
promise.then(function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
}).error(function(error){
console.log(error);
});
正如本回答的评论部分所强调的那样,这些对象实际上并不是承诺,需要加以考虑(参见Queries are not promises)。
第3。使用Mongoose Streams
最后,Mongoose还支持流和流是事件发射器。因此,您可以获得一个流,然后订阅数据&#39;和&#39;错误&#39;事件。像这样:
function getjedisStream(name){
var stream = Jedi.find({name:name}).stream();
return stream;
}
然后你就可以做到:
var stream = getJedisStream('Anakin');
stream.on('data', function(jedis){
jedis.forEach(function(jedi){
console.log(jedi.name);
});
});
stream.on('error', function(error){
console.log(error);
});
Source,供将来参考。
答案 1 :(得分:5)
it is being executed before the assignment.
async function(req, res) {
var user;
await users.findOne({}, function(err,pro){
user=pro;
});
console.log(user); \\ it's define
});
答案 2 :(得分:1)
您可以轻松实现这一目标。
const getUser = async ( req, res ) => {
let users = () => ( User.find({_id : users_list[i]['user_id']},{email : 1, credits : 1}).exec() );
try { res.send({"user":await users() });}
catch(e) { console.log(e) }
}
app.get('/user' , getUser);
答案 3 :(得分:0)
您可以通过以下代码获得所需的结果。希望对您有帮助。.
QMainWindow window;
window.setWindowFlags(Qt::Window | Qt::FramelessWindowHint);
window.setAttribute(Qt::WA_TranslucentBackground, true);
window.setFixedSize(800, 600);
QWidget widget(&window);
widget.setStyleSheet("background-color: rgba(255, 0, 0, 128)");
window.setCentralWidget(&widget);
window.show();