如何使用 expressjs 和 mongodb 使用 promises/callbacks?
How to use promises/callbacks using expressjs and mongodb?
我真的很困惑 promises 和异步 javascript 是如何工作的。我想在 /user 上执行 GET 并查询 mongo 以便以某种方式处理第一个查询的结果以形成第二个查询的查询,并且该查询的结果是第三个查询的查询询问。
基本上我希望最终的mongo结果通过res.send(result)发送回客户端。
执行此操作的正确方法是什么,以便客户端通过第三个嵌套 mongo 查询的结果返回 200 OK?
app.get('/user', function (req, res, next) {
var query = {"isRegistered": false }
db.collection('users', function (err, collection) {
collection.find(query).toArray(function (err, result) {
if (err) {
console.log(err)
}
else {
if (result.length > 0) {
// do some random processing
var randomUser = result[Math.floor(Math.random() * result.length)]
// do ANOTHER db query
query = {"age": randomUser.age}
collection.find(query).toArray(function (err,result) {
if (err) {
console.log(err)
}
else {
// do some other logic ...
query = {something}
collection.find(query).toArray(function (err,result) {
if (err) {
console.log(err);
}
else {
// FINALLY RETURN THIS RESULT
res.send(result);
next()
}
})
}
})
}
}
});
});
假设您正在使用 Node 的常规 Mongo 客户端,它已经 return 承诺查询,这意味着您可以 return 下一个查询并在then
,或者在最后用 catch
.
捕获错误
未经测试,但类似的东西应该可以工作
app.get('/user', function (req, res, next) {
var query = {"isRegistered" : false };
var collection = db.collection('users');
collection.find(query).toArray().then( result => {
var randomUser = result[Math.floor(Math.random() * result.length)];
var query2 = {"age" : randomUser.age};
return collection.find(query2).toArray();
}).then( result => {
var query3 = {something : 'something'};
return collection.find(query3).toArray();
}).then( result => {
res.status(200);
res.send(result);
}).catch( err => {
console.log(err);
res.status(500);
});
});
请注意,如果未传递回调函数,toArray
等方法会自动 return 承诺。
我真的很困惑 promises 和异步 javascript 是如何工作的。我想在 /user 上执行 GET 并查询 mongo 以便以某种方式处理第一个查询的结果以形成第二个查询的查询,并且该查询的结果是第三个查询的查询询问。
基本上我希望最终的mongo结果通过res.send(result)发送回客户端。
执行此操作的正确方法是什么,以便客户端通过第三个嵌套 mongo 查询的结果返回 200 OK?
app.get('/user', function (req, res, next) {
var query = {"isRegistered": false }
db.collection('users', function (err, collection) {
collection.find(query).toArray(function (err, result) {
if (err) {
console.log(err)
}
else {
if (result.length > 0) {
// do some random processing
var randomUser = result[Math.floor(Math.random() * result.length)]
// do ANOTHER db query
query = {"age": randomUser.age}
collection.find(query).toArray(function (err,result) {
if (err) {
console.log(err)
}
else {
// do some other logic ...
query = {something}
collection.find(query).toArray(function (err,result) {
if (err) {
console.log(err);
}
else {
// FINALLY RETURN THIS RESULT
res.send(result);
next()
}
})
}
})
}
}
});
});
假设您正在使用 Node 的常规 Mongo 客户端,它已经 return 承诺查询,这意味着您可以 return 下一个查询并在then
,或者在最后用 catch
.
未经测试,但类似的东西应该可以工作
app.get('/user', function (req, res, next) {
var query = {"isRegistered" : false };
var collection = db.collection('users');
collection.find(query).toArray().then( result => {
var randomUser = result[Math.floor(Math.random() * result.length)];
var query2 = {"age" : randomUser.age};
return collection.find(query2).toArray();
}).then( result => {
var query3 = {something : 'something'};
return collection.find(query3).toArray();
}).then( result => {
res.status(200);
res.send(result);
}).catch( err => {
console.log(err);
res.status(500);
});
});
请注意,如果未传递回调函数,toArray
等方法会自动 return 承诺。