node.js對mongodb的連線&增刪改查(附async同步流程控制)
阿新 • • 發佈:2018-12-24
最近嘗試了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已經讓我大開眼界了。我就順便記錄下來了。