Nodejs + MongoDb

1、搭建開發環境css

進入 http://nodejs.org 下載開發環境html

http://Expressjs.com 下載安裝Express  npm install -g expressjava

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------node

MongoDB對許多平臺都提供驅動能夠訪問數據庫,如C#、Java、Node.js等。這裏以Node.js爲例。mongodb

安裝MongoDB訪問驅動
使用包管理器,在命令行執行以下指令:數據庫

全局安裝驅動express

npm install mongodb -gnpm

在當前項目中引入mongodb設計模式

npm install mongodb --saveapp

 

在項目的根目錄下新建一個db.js文件,使用Node.js操做MongoDB

添加數據

//引入mongodb模塊,得到客戶端對象
var MongoClient = require('mongodb').MongoClient;
//鏈接字符串
var DB_CONN_STR = 'mongodb://localhost:27017/gomall';    

//定義函數表達式,用於操做數據庫並返回結果
var insertData = function(db, callback) {  
    //得到指定的集合 
    var collection = db.collection('users');
    //插入數據
    var data = [{_id:7,"name":'rose',"age":21},{_id:8,"name":'mark',"age":22}];
    collection.insert(data, function(err, result) { 
        //若是存在錯誤
        if(err)
        {
            console.log('Error:'+ err);
            return;
        } 
        //調用傳入的回調方法,將操做結果返回
        callback(result);
    });
}

//使用客戶端鏈接數據,並指定完成時的回調方法
MongoClient.connect(DB_CONN_STR, function(err, db) {
    console.log("鏈接成功!");
    //執行插入數據操做,調用自定義方法
    insertData(db, function(result) {
        //顯示結果
        console.log(result);
        //關閉數據庫
        db.close();
    });
});

運行結果:

鏈接成功!
{ result: { ok: 1, n: 2 },
  ops: 
   [ { _id: 7, name: 'rose', age: 21 },
     { _id: 8, name: 'mark', age: 22 } ],
  insertedCount: 2,
  insertedIds: [ 7, 8 ] }

修改數據

//引入mongodb模塊,得到客戶端對象
var MongoClient = require('mongodb').MongoClient;
//鏈接字符串
var DB_CONN_STR = 'mongodb://localhost:27017/gomall';    

//定義函數表達式,用於操做數據庫並返回結果
var updateData = function(db, callback) {  
    //得到指定的集合 
    var collection = db.collection('users');
    //要修改數據的條件,>=10歲的用戶
    var  where={age:{"$gte":10}};
    //要修改的結果
    var set={$set:{age:95}};
    collection.updateMany(where,set, function(err, result) { 
        //若是存在錯誤
        if(err)
        {
            console.log('Error:'+ err);
            return;
        } 
        //調用傳入的回調方法,將操做結果返回
        callback(result);
    });
}

//使用客戶端鏈接數據,並指定完成時的回調方法
MongoClient.connect(DB_CONN_STR, function(err, db) {
    console.log("鏈接成功!");
    //執行插入數據操做,調用自定義方法
    updateData(db, function(result) {
        //顯示結果
        console.log(result);
        //關閉數據庫
        db.close();
    });
});

運行結果:

鏈接成功!
{ result: { n: 5, nModified: 5, ok: 1 }

查詢數據

//引入mongodb模塊,得到客戶端對象
var MongoClient = require('mongodb').MongoClient;
//鏈接字符串
var DB_CONN_STR = 'mongodb://localhost:27017/gomall';    

//定義函數表達式,用於操做數據庫並返回結果
var findData = function(db, callback) {  
    //得到指定的集合 
    var collection = db.collection('users');
    //要查詢數據的條件,<=10歲的用戶
    var  where={age:{"$lte":10}};
    //要顯示的字段
    var set={name:1,age:1};
    collection.find(where,set).toArray(function(err, result) { 
        //若是存在錯誤
        if(err)
        {
            console.log('Error:'+ err);
            return;
        } 
        //調用傳入的回調方法,將操做結果返回
        callback(result);
    });
}

//使用客戶端鏈接數據,並指定完成時的回調方法
MongoClient.connect(DB_CONN_STR, function(err, db) {
    console.log("鏈接成功!");
    //執行插入數據操做,調用自定義方法
    findData(db, function(result) {
        //顯示結果
        console.log(result);
        //關閉數據庫
        db.close();
    });
});

運行結果:

鏈接成功!
[ { _id: 0, name: 'zhangguo0', age: 8 },
  { _id: 1, name: 'zhangguo1', age: 9 } ]

刪除數據

//引入mongodb模塊,得到客戶端對象
var MongoClient = require('mongodb').MongoClient;
//鏈接字符串
var DB_CONN_STR = 'mongodb://localhost:27017/gomall';    

//定義函數表達式,用於操做數據庫並返回結果
var findData = function(db, callback) {  
    //得到指定的集合 
    var collection = db.collection('users');
    //要刪除數據的條件,_id>2的用戶刪除
    var  where={_id:{"$gt":2}};
    collection.remove(where,function(err, result) { 
        //若是存在錯誤
        if(err)
        {
            console.log('Error:'+ err);
            return;
        } 
        //調用傳入的回調方法,將操做結果返回
        callback(result);
    });
}

//使用客戶端鏈接數據,並指定完成時的回調方法
MongoClient.connect(DB_CONN_STR, function(err, db) {
    console.log("鏈接成功!");
    //執行插入數據操做,調用自定義方法
    findData(db, function(result) {
        //顯示結果
        console.log(result);
        //關閉數據庫
        db.close();
    });
});

運行結果:

鏈接成功!
{ result: { n: 4, ok: 1 },

http://www.cnblogs.com/best/p/6212807.html

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

繼續安裝ejs:npm install ejs

若是要想運行Node.js程序,則如今只可以使用「node app.js」,而這樣的運行方式,若是在app.js文件修改以後每每須要從新啓動才能夠加載新的內容,這對於開發是很是不方便的, 爲此,可使用一個supervisor組件包,它能夠動態的加載修改以後的開發程序。

下載安裝supervisor

npm install -g supervisor

利用supervisor方式運行程序

supervisor app.js

2、代碼開發

 使用EJS模板

全部用戶須要保存的頁面都應該保存在views目錄下,可是此時index.ejs是一個html頁面,而有的人不習慣於使用ejs,習慣於使用html,爲了解決這樣的問題,則須要配置模板。

         定義加載的項目模塊

var ejs = require('ejs') ; // require()函數表示要加載的模塊

         須要增長一些相關的配置;

app.engine('html',ejs.__express) ;

app.set('view engine', 'html'); // 替換:app.set('view engine', 'ejs');

         將views中的index.ejs文件修改成index.html文件,觀察是否能夠改變。

         下面編寫一個用戶的登陸,登陸的時候只提供用戶id(userid)和密碼,下面創建幾個相關的操做頁面:login.html、welcome.html。可是在創建這兩個文件的時候,請必定要注意,文件的編碼必須設置爲UTF-8,不然沒法操做中文。

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
   <h1><%= title %></h1>
<form method="post">
    用戶ID:<input type="text" name="userid" id="userid"><br>&nbsp;&nbsp;碼:<input type="password" name="password" id="password"><br>
    <input type="submit" value="登陸">
    <input type="reset" value="重置">
</form>
</body>
</html>
login.html
<!DOCTYPE html>
<html>
  <head>
    <title>Welcome</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>歡迎<%=user.userid%>光臨!</h1>
    <h1><a href="logout">註銷</a></h1>
  </body>
</html>
welcome.html
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p><a href="login">用戶登陸</a></p>    
  </body>
</html>
index.html

在每個頁面之中並無定義直接的鏈接,由於Node.js依然屬於MVC設計模式的範疇,因此針對於MVC的實現,此處所編寫的所有都屬於映射名稱,全部的映射路徑都須要經過app.js進行相應的路由配置。

 3、設計路由功能

 

 

app.get('/', routes.index);

app.get('/login', routes.login);         // 此處還須要routes/index.js修改

app.post('/login', routes.doLogin);  // 處理post請求,表單提交

app.get('/logout', routes.logout);     // 處理註銷

app.get('/welcome', routes.welcome);                // 進入到首頁

 

         而這5 個操做路徑配置完成以後,還須要找到routes/index.js文件進行相關的回調函數的配置操做。

範例:修改index.js文件

/*
 * GET home page.
 */

exports.index = function(req, res){
  res.render('index', { title: 'Express' });
};
exports.login = function(req, res){
  res.render('login', { title: '用戶登陸' });
};
exports.doLogin = function(req, res){
    var user = {userid:'mldnadmin' , password:'hellojava'} ;    // 固定數據
    // 若是要想接收請求,經過req對象
    if (req.body.userid==user.userid && req.body.password==user.password) {
        res.redirect("/welcome?uid=" + req.body.userid) ;    // 地址重寫
    }
    res.redirect("/login") ;
};
exports.logout = function(req, res){
  res.render('login', { title: '用戶註銷' });
};
exports.welcome = function(req, res){
    // 若是是地址欄參數使用req.query.參數名稱接收
    var user = {
        userid : req.query.uid     }
  res.render('welcome', { title: '程序首頁' , user:user });
};
index.js

那麼在整個的基礎過程之中,最爲重要的步驟就配置app.js中的路由,固然,路由的最終控制是經過index.js文件完成的,在這個文件就至關於Java中的Servlet功能,負責跳轉。

4、利用MongoDB來解決數據庫的登陸問題

下載MongoDB:http://www.mongodb.org/

之後使用mongodb暫時將其定義爲在d盤上,因此如今須要在d盤上創建一個data/db的文件目錄。

         隨後打開一個新的命令行窗口,讓路徑設置在d盤路徑下,首先啓動mongodb服務:mongod.exe;

 

Wed Aug 14 16:13:19.739 [initandlisten] MongoDB starting : pid=4344 port=27017 dbpath=\data\db\ 32-bit host=cab34d4eb860431

Mongodb服務啓動以後,下面也一樣須要打開一個新的命令行窗口,使用mongo進行操做。

打開命令行窗口輸入:mongo.exe命令,啓動mongodb的命令窗口。

範例:建立一個新的數據庫(mongodb裏沒有數據庫):

use mldndb

範例:設置一個users文檔

db.users.insert({userid:'mldn',name:'lixinghua',password:'hello'}) ;

db.users.insert({userid:'mldnjava',name:'mole',password:'nodejs'}) ;

         此時能夠經過show tables查看全部的集合,已經發現存在了users集合。下面查詢所有:

db.users.find();

         此處爲了方便,因此全部的密碼並無採用加密的處理方式。

         但是若是如今直接利用node.js提供的mongodb操做不方便使用。

 

因此在處理mongodb的時候建議使用express-mongoose組件。

npm install express-mongoose

         此組件能夠和express組件完美的搭檔。

下載一個mongoose的組件。:npm install mongoose

實現數據庫驗證

當mongodb配置完成以後,下面就首先須要定義一個與Users集合有關的新的組件。相似於VO類的概念,只不過如今這個類須要經過*.js文檔描述,在routes目錄下建立models.js文件。

var mongoose = require('mongoose') ;    // 定義使用組件
var Schema = mongoose.Schema ;    // 建立模式
var UserSchema = new Schema({
    userid : String ,
    name : String ,
    password : String
}) ;    // 定義了一個新的模式,可是此模式還未和users集合有關聯
exports.User = mongoose.model('User',UserSchema) ;    // 與Users表關聯
建立models.js文件

範例:修改index.js文件,使用新的組件模塊

var mongoose = require('mongoose') ;     // 導入組件

var models = require('./models') ;   // 導入自定義組件

var User = models.User ;       // 使用User模型,對應的users表

mongoose.connect('mongodb://localhost/mldndb') ;  // 鏈接數據庫

         如今最須要改變的就是doLogin操做,由於此處須要使用數據庫驗證。

         若是要想完成登陸驗證,只須要根據用戶名和密碼取得數據量便可。

db.users.count({userid:'mldn',password:'hello'}) ;

         只須要根據返回的數量就能夠肯定用戶名和密碼是否正確。

exports.doLogin = function(req, res){

         // 如今拼湊出了一個基本的字符串

         var query_doc = {userid:req.body.userid , password:req.body.password} ;    // 固定數據

         User.count(query_doc,function(err,doc){// 直接利用mongodb的命令進行操做

                   if(doc == 0) {      // 輸入錯誤,沒有此信息

                            res.redirect("/login") ;

                   } else {       // 成功

                            res.redirect("/welcome?uid=" + req.body.userid) ;     // 地址重寫

                   }

         }) ;

};

         並且最爲關鍵的是整個過程之中,再也不去考慮數據庫的關閉問題,極大的方便了用戶開發。

相關文章
相關標籤/搜索