Express调用mongodb时关于异步的问题?
我需要获取mongo数据库中某个表的最大的cateID值,而找到的方式是:db.find().sort({"cateID" : -1}).limit(1)
,但是这种方式并不能像MySQL一样直接返回一个值,而是返回了一个看不懂的东西:
而我唯一知道的,找到返回对象的方式是:
myDB.find().sort({"cateID" : -1}).limit(1).toArray() .then(function(result) {
console.log(result[0].cateID)
})
这种方式能正确输出我想要的表中最大的cateID,但是它是异步的,后面的代码我就必须在then里面写,这里就出现问题了:怎么获取then里面的回调函数外面的参数?
或者,有没有能够用同步的方式获取mongodb中某个字段值的方法?
我的POST请求的完整代码如下:
router.post("/addCategory",function(req,res){ var myDB = db.collection("category");
var message = req.body;
var cateID;
//需要从数据库获得最大的cateID字段值
// 获取最大cateID操作
//…………
//获取到最大cateID后
myDB.insertOne({
cateName:message.cateName,
cateID:cateID,
articleNum:0,
})
.then(function(){
res.json({
status: 0,
message: "提交成功"
})
})
.catch(function(err){
throw err;
})
})
回答:
整个NodeJS的核心就是异步非等待的编程模型,这也是NodeJS性能表现优秀的其中一个最根本原因。而其中最挑战的部分就在于,你要完全忘记同步编程的套路,用异步的思想来思考问题。我没有办法在这里完整全面地介绍异步编程,详细内容请查阅网上相关文章。只从你的问题来讲,你希望查到cateID
之后再进行message
的插入,所以在获取cateID
之后再进行insertOne
不就好了?
router.post("/addCategory", function(req, res) { var myDB = db.collection("category");
var message = req.body;
var cateID;
myDB.find().sort({
"cateID": -1
}).limit(1).toArray().then(function(result) {
let cateId = result[0].cateID;
myDB.insertOne({
cateName: message.cateName,
cateID: cateID,
articleNum: 0,
}).then(function() {
res.json({
status: 0,
message: "提交成功"
})
}).catch(function(err) {
throw err;
});
});
});
你自己已经知道要这样做,但是你认为then
里面不能使用外面的变量,不知道这个结论是哪里来的?then
里面是我们所谓的闭包。闭包外面看不到里面,但是里面能访问外面,关于闭包的特点也有很多介绍,不妨搜索一下。
另外强调一下不要在异步模型中寻求使用同步方式来做事情,这会极大地损伤你的性能。
以上是 Express调用mongodb时关于异步的问题? 的全部内容, 来源链接: utcz.com/p/196466.html