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

回到顶部