node.js対mongodbの接続&添削調査(async同期フロー制御付)

9197 ワード

最近はnode.jsとmongodbの使用を試みました.次は一つのステップです.
1.monogodbデータベースを起動する
オンラインでmongodbデータベースをダウンロードします.
mongodbルートディレクトリの下にフォルダを作成します.testはmongodbの新しいデータベースの一つだと思います.
バッチファイルxx.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.モノゴdbモジュールに依存する
mongodbの添削を書きたいです.論理のjsファイルに以下の依存を入れます.
var mongo = require("mongodb");
4.汎用小関数
いくつかの共通の関数を書いて、最後に一つのオブジェクトを作成して、関数を全部対象にかけて、最後に対象のexportを外に出せばいいです.
/**
 *              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ドライバです.だから、上のいくつかの関数を順番に実行する時、必ず問題があります.前の関数が時間がかかりますと、後ろの関数は前の函数を待たずに運行します.前の関数の運転結果は後の関数で使われます.
この場合は、非同期I/Oでシリアル制御フロー制御を行う必要があります.
本にはasyncモジュールが紹介されています.手続きは第三者が導入することを愛しています.
npm install async --save
requireが入る
var async=require("async");
使用方法:Nodejs非同期プロセス制御Aync
私がここで使っているのは、waterfall滝モードフロー制御github waterfallシステムのデモアです.
そして私は無邪気に使いました.
 //  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);
    })
結果としては、2番目の関数が最初の関数よりも先に動作しました.3番目の関数が正しく動作しませんでした.
次はプロモーションの仕組みを使ってみましょう.でも、waterfallはもう視野を広くしました.ついでにメモしておきます.
次の紹介はプロミセを使ってからです.これは次のリンクを使ってモジュールQのpromiseメカニズムを使ってデータベース操作の同期を実現する問題です.