node.js - Express调用mongodb时关于异步的问题?

查看:73
本文介绍了node.js - 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里面是我们所谓的闭包。闭包外面看不到里面,但是里面能访问外面,关于闭包的特点也有很多介绍,不妨搜索一下。
另外强调一下不要在异步模型中寻求使用同步方式来做事情,这会极大地损伤你的性能。

这篇关于node.js - Express调用mongodb时关于异步的问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆