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です.
2.mongodbモジュールのロード
私達のnode.jsプロジェクトの中で直接npmはmongodbモジュールに入ります.
mongodbの添削を書きたいです.論理のjsファイルに以下の依存を入れます.
いくつかの共通の関数を書いて、最後に一つのオブジェクトを作成して、関数を全部対象にかけて、最後に対象のexportを外に出せばいいです.
「超実用的なnode.jsコードセグメント」を見て、Node.jsは非同期I/Oドライバです.だから、上のいくつかの関数を順番に実行する時、必ず問題があります.前の関数が時間がかかりますと、後ろの関数は前の函数を待たずに運行します.前の関数の運転結果は後の関数で使われます.
この場合は、非同期I/Oでシリアル制御フロー制御を行う必要があります.
本にはasyncモジュールが紹介されています.手続きは第三者が導入することを愛しています.
私がここで使っているのは、waterfall滝モードフロー制御github waterfallシステムのデモアです.
そして私は無邪気に使いました.
次はプロモーションの仕組みを使ってみましょう.でも、waterfallはもう視野を広くしました.ついでにメモしておきます.
次の紹介はプロミセを使ってからです.これは次のリンクを使ってモジュールQのpromiseメカニズムを使ってデータベース操作の同期を実現する問題です.
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メカニズムを使ってデータベース操作の同期を実現する問題です.