如何在nodejs中同步操作两个mongodb查询?

时间:2017-11-13 05:56:41

标签: node.js mongodb synchronization

我正在用Node.js和MongoDB编写一个shortenUrl API。

我正在使用一个集合来存储递增ID。

每次用户要求缩短网址时,

  • 服务器会向database询问最新的可用号码
  • 然后进行base62转换。

    但是,由于Nodejs的异步功能,获取递增ID和插入新URL对的完成时间不确定。有时,服务器会插入不带递增ID的URL对。

      app.post("/" , function(req , res) {
                const curLongUrl = req.body.longUrl;
                const data = {
                    longUrl : curLongUrl,
                    shortUrl : ""
                }; 
         const IDurl = "https://shortenurl-rustyblade.c9users.io/";
    
            mongo.connect(url , function(err , db) {
            if(err) { 
                return console.log(err);
            }
    
            const increment = db.collection("autoIncrement");
            increment.findOne({"function" : "incrementKey"} , function(err , docs) {
                if(err) {
                    return console.log(err);
                }
                const curID = docs.increment;
                console.log(curID);
                const curShortUrl = IDurl + curID;
                data.shortUrl = curShortUrl;
                db.close();
            });
        });
    
    
        mongo.connect(url , function(err , db) {
            if(err) { 
                return console.log(err);
            }    
            const col = db.collection("urlTable");
            col.insert(data , function(err , document) {
                if(err) { 
                    return console.log(err);
                }
                console.log(JSON.stringify(data));
                db.close();
                res.send(JSON.stringify(data));
            });
        });
        //res.send(JSON.stringify(data));
    });
    

1 个答案:

答案 0 :(得分:0)

似乎:

yourAPI("/", function () {
    // ...

    increment(function () {
        // ...

        // if increase success

        urlTableInsert(..., function () {
            // ...

            //  if insert success
            db.close();
            res.send(JSON.stringify(data));
        })
    })
})  

你可以使用Promise,co或Async / await等来解决Callback Hell问题。