1. 程式人生 > >node.js對mongodb的連線&增刪改查(附async同步流程控制)

node.js對mongodb的連線&增刪改查(附async同步流程控制)

最近嘗試了node.js和mongodb的使用。下面來一波步驟。

1.啟動mongodb資料庫

官網下載mongodb資料庫

在mongodb根目錄下建立資料夾:假設取名為test。
我們認為test就是mongodb新建的資料庫一枚。

建立批處理檔案 xxx.bat,內容如下:

執行e盤mongodb資料夾下bin目錄下的 mongod.exe,引數為
-dbpath E:\mongodb\test。

E:\mongodb\bin\mongod.exe -dbpath E:\mongodb\test

這樣就啟動了mongodb下test資料庫的伺服器。

2.載入mongodb模組

在我們的node.js專案中直接npm入mongodb模組

npm install mongodb --save

3.依賴mongodb模組

在想要寫對mongodb的增刪改查邏輯的js檔案下加入以下依賴

var mongo = require("mongodb");

4.通用小函式

寫了幾個通用的小函式,最後建立一個物件,將函式全都掛到物件上,最後把物件exports出去即可。

/**
 * 建立資料庫伺服器並開發名為databaseName的資料庫
 * @param host ip
 * @param port 埠
 * @param databaseName
 * @return
開啟失敗返回-1 ,成功返回database */
function openDatabase(host,port,databaseName){ //建立資料庫所在的伺服器 var server = new mongo.Server(host, port, {auto_reconnect: true}); var db = new mongo.Db(databaseName, server, {safe: true}); db.open(function (err, db) { if (err) { console.log('開啟資料庫失敗'
); return -1; } else { console.log('開啟資料庫成功'); } }); return db; } /** * 連線資料集合 * @param db 資料庫 * @param collectionName 資料集合名稱 * @return 成功返回collection,失敗返回-1 */ function openCollection(db,collectionName){ db.collection(collectionName,{safe:true},function(errcollection,collection){ if(!errcollection){ console.log('連線資料集合成功'); return collection; }else{ console.log('連線數集合失敗'); return -1; } }); } /** * 插入資料 * @param collection * @param tmp 要插入的資料 * @return 成功返回collection,失敗返回-1 */ function insertCollection(collection,tmp){ //var tmp = {username:'hello',password:1}; collection.insert(tmp,{safe:true},function(err, result){ if(err){ console.log('傳入資料集合失敗'+tmp); return -1; }else { console.log('插入資料集合成功'+result); } }); return collection; } /** * 查詢資料集合 沒有條件 * @param collection * @return 成功返回查詢到的資料集合內容,失敗返回-1 */ function findCollectionNoCondition(collection){ collection.find().toArray(function(errfind,cols){ if(!errfind){ console.log('查詢資料集合成功'+JSON.stringify(cols)); return JSON.stringify(cols); }else { console.log('查詢資料集合失敗'); return -1; } }); } /** * 查詢資料集合 有條件 * @param collection * @return 成功返回查詢到的資料集合內容,失敗返回-1 */ function findCollectionHasCondition(collection,tmp){ collection.find(tmp).toArray(function(errfind,cols){ if(!errfind){ console.log('查詢資料集合成功'+JSON.stringify(cols)); return JSON.stringify(cols); }else { console.log('查詢資料集合失敗'); return -1; } }); } /** * 刪除資料集合 * @param collection * @param tmp * @return 成功返回資料集合,失敗返回-1 */ function removeCollection(collection,tmp){ //var tmp = {username:'hello',password:1}; collection.remove(tmp,{safe:true},function(err, count){ if(err){ console.log('刪除資料集合失敗'+tmp); return -1; }else { console.log('刪除資料集合成功'+count); return collection; } }); }

4.async模組解決node.js非同步架構下同步邏輯的實現

看到《超實用的node.js程式碼段》這本書上,講到Node.js是非同步I/O驅動,所以在我們順序執行上面的幾個函式的時候,一定會遇到一個問題:如果前面de函式耗時長,那麼後面的函式不會等前面的函式執行完,而是直接執行。但是我的前一個函式的執行結果是要被後一個函式使用的呀。

這時候就需要在非同步I/O下進行序列控制流控制。

書中介紹了async模組,手續愛你第三方引入。

npm install async --save

require進來

var async=require("async");

然後我就天真的使用了

 //使用async瀑布模型流程控制執行 資料庫的連線查詢
    async.waterfall([
        function(callback){
            var db;
            db=user.openDatabase("localhost",27017,"test");
            callback(null,db);
        },
        function(db,callback){
            var collection;
            if(db!=-1){
                collection=user.openCollection(db,'users');
            }
            callback(null,collection);
        },
        function(collection,callback){
            var res;
            if(collection!=-1){
                res=user.findCollectionNoCondition(collection);
                console.log(res);
                callback(null,3);
            }
        }
    ],function(err,result){
        console.log("async瀑布模型流程控制執行成功"+result);
    })

結果還是第二個函式先於第一個函式執行成功,導致第三個函式不能正確執行。

接下來還是使用promise機制好了。但是waterfall已經讓我大開眼界了。我就順便記錄下來了。