天天看點

Node.JS + MongoDB技術淺談Node.JS + MongoDB技術講座4、總結

看到一個Node.JS + MongoDB的小例子,分享給大家,魔樂科技軟體學院(www.mldnjava.cn)的講座

Node.JS + MongoDB技術講座

         雲計算 +大資料 = 未來。

         在中國的雲計算上基本上是一個概念,個人感覺與當初的SOA沒有太大的差別,空泛的理論。

         中小型開發的未來 = Node.JS + MongoDB解決,并不是說Java就沒用了。

1、在前面的話

         Java技術始終作為高端軟體使用者的首選,隻要從事大型的軟體開發,那麼Java都是必須要使用的技術,尤其是在中國的相關項目之中,Java是會作為不二的選擇。

         所有的伺服器端技術本質上沒有太多差別,都需要WEB Server,都需要一些基本的伺服器端開發代碼,都需要操作資料庫,或者加入一些其他的操作支援。

         開發之中你們最大的難關:伺服器端代碼是寫完了,可是如果在修飾界面有問題的時候,往往出面的還是你。缺少不同平台的交流。2003年之後開始流行的WebService徹底的改變了這一個現狀。

         發現,JSON作為資料的傳輸,以及前背景都采用JavaScript應該可以友善的進行開發。

個人對JavaScript看法:

         1、   最早的時候我們經常會糾結于一個問題:資料的驗證是在前台做還是在背景做?在這段時間之内,加上浏覽器的戰争,導緻了JavaScript無用論;

         2、   2005年開始中國流行的AJAX技術開始,JavaScript可以操作異步處理,而且使用DOM解析也可以動态的操作HTML頁面,基于XML的資料傳輸;

         3、   JQuery技術包裝了一系列的DOM解析操作,簡化了JavaScript的操作;

         但是不管如何改變,在之前,JavaScript可以做的工作隻是在用戶端運作。那麼把JavaScript能否修改一下,加強其功能,讓其可以變成适合伺服器端的開發,就造就了Node.JS。

         今天的目的不是講解Node.JS的相關文法,隻是感受Node.JS的開發友善。

         個人推測:在PHP +MySQL逐漸萎靡的今天,取代它們的應該就是Node.JS + MongoDB。

2、使用Node.JS開發WEB應用

2.1、搭建開發環境

         Node.JS是一個平台,而且這個平台使用的C++開發,基于JavaScript作為前台的表現語言。它是伺服器端的語言,但是真的不需要去配置伺服器。

         Node.js下載下傳完成後需要首先進行安裝。

         在使用Node.JS過程之中一定需要始終連接配接網絡。總需要從網上下載下傳相應的開發包。

         安裝完成之後會出現相應的可執行指令,而現在這些指令不屬于windows,是以需要将目錄配置到path環境屬性之中。不同路徑之間要使用“;”分隔。

         Express是整個Node.js之中最為常用的一個架構(開發包),使用它可以友善的快速建構起一個WEB項目。

         首先Express是一個Node.js最為常用的一個開發包,那麼應該首先将其下載下傳,而且下載下傳的方式分為兩種:隻針對于一個項目進行開發包的下載下傳,或者是針對于整個Node.js開發環境。

         現在下載下傳開發包:

npm install -g express

         之後會出現許多的提示資訊,提示使用者的相關下載下傳的進度。

         下載下傳完成之後,所有的全局包都儲存在一個固定的目錄:

C:Documents and SettingsAdministratorApplication Data

pm

         隻要是開發項目,那麼肯定需要一個儲存項目的檔案目錄,此時的目錄就将其定義為mldnnodedemo。

mkdir mldnnodedemo

         而後進入到此目錄之中(就想象為Eclipse的工作區,一個工作區之中可以定義多個項目。

cd mldnnodedemo

         下面是一個非常重要的步驟,需要建立一個express項目(有明确的檔案夾要求)。

express -e myproject

         此時就表示項目建立完成了,就算你使用Eclipse的相關插件,也必須按照此步驟進行操作。而建立的項目之中存在

了一個app.js檔案,那麼這個檔案就作為了整個程式運作的主檔案出現,即:隻需要執行它,就可以運作HTTP Server。

http.createServer(app).listen(app.get('port'), function(){

  console.log('Express server listening on port ' + app.get('port')); 

è System.out.println()一樣,直接背景輸出

});

         此時,http的服務将在3000端口上監聽使用者的請求。

         如果要想啟動伺服器,直接進入到myproject目錄裡面,輸入:node app.js;

         之前下載下傳的express貌似有點問題,重新在本項目裡面下載下傳一個:“npm install express”。此時在myproject目錄下也存在了node_modules目錄,同時儲存了express程式包。

         程式運作之後就會出現以下的提示資訊:

Express server listening on port 3000

         表示在3000的端口監聽。随後打開浏覽器輸入:http://localhost:3000

         繼續安裝ejs:npm install ejs。

         這個就是預設顯示界面。這個界面的内容儲存在views目錄下。

         但是現在有一個小小的問題出現了,如果要想運作Node.js程式,則現在隻能夠使用“node app.js”,而這樣的運作方式,如果在app.js檔案修改之後往往需要重新啟動才可以加載新的内容,這對于開發是非常不友善的, 為此,可以使用一個supervisor元件包,它可以動态的加載修改之後的開發程式。

         下載下傳:supervisor

npm install -g supervisor

         随後直接利用supervisor方式運作程式:

supervisor app.js

         以後項目之中,每一次檔案的改變,那麼都可以及時的監聽到,同時也可以及時加載新的代碼檔案,對于開發是非常友善,但是有一點不友善:每一次修改的時候如果代碼有錯,背景會一直報錯。

2.2、編寫代碼

         下面要進行正規的開發了,本次要開發一個簡單的登入程式,而這個使用者登入程式,也分為兩個開發步驟完成:第一步:是固定的使用者名和密碼完成、第二步:是基于MongoDB進行的登入開發。

         之前通過代碼可以發現,所有使用者需要儲存的頁面都應該儲存在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,否則無法操作中文。

範例:定義login.html

<!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>

範例:定義歡迎頁 —— welcome.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>

範例:修改index.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>

         在每一個頁面之中并沒有定義直接的連接配接,因為Node.js依然屬于MVC設計模式的範疇,是以針對于MVC的實作,此處所編寫的全部都屬于映射名稱,所有的映射路徑都需要通過app.js進行相應的路由配置。

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 });

};

         那麼在整個的基礎過程之中,最為重要的步驟就配置app.js中的路由,當然,路由的最終控制是通過index.js檔案完成的,在這個檔案就相當于Java中的Servlet功能,負責跳轉。

3、利用MongoDB來解決資料庫的登入問題

         MongoDB可以說是在以後未來發展之中,在中小型資料庫的市場上一定是具備發展優勢的資料庫。而且與Node.js的結合也非常的友善,并且多種多樣。

         MongoDB和Oracle資料庫完全是不一樣的操作結構:MongoDB使用的是文檔存儲,而Oracle采用的是表存儲。

列名稱 列名稱 列名稱 列名稱 列名稱
sdf fsd fsda fsda fsda
fdsa fsdafdsa fdsa fsad fsda
fsda af 324 dsf 2342

3.1、搭建環境

         SQL:作為整個資料庫的開發标準已經存在了幾十年了,可是NoSQL技術最早的提出指的是不使用SQL使用。但是後來發現不能夠離開SQL,是以NoSQL又被翻譯為:Not Only SQL(不僅SQL)。

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

         下載下傳下來的MongoDB是一個*.zip檔案,直接将其解壓縮後就可以使用了。但是在使用之前,還需要為其進行path環境的配置:D:mongodbin。

         以後使用mongodb暫時将其定義為在d盤上,是以現在需要在d盤上建立一個data/db的檔案目錄。

         随後打開一個新的指令行視窗,讓路徑設定在d盤路徑下,首先啟動mongodb服務:mongod.exe;

Wed Aug 14 16:13:19.739 [initandlisten] MongoDB starting : pid=4344 port=27017 dbpath=datadb 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'}) ;

         此時可以通過showtables檢視所有的集合,已經發現存在了users集合。下面查詢全部:

db.users.find();

         此處為了友善,是以所有的密碼并沒有采用加密的處理方式。

         可是如果現在直接利用node.js提供的mongodb操作不友善使用。

         是以在處理mongodb的時候建議使用express-mongoose元件。

npm install express-mongoose

         此元件可以和express元件完美的搭檔。

         還需要下載下傳一個mongoose的元件。:npm install mongoose

3.2、實作資料庫驗證

         當mongodb配置完成之後,下面就首先需要定義一個與Users集合有關的新的元件。類似于VO類的概念,隻不過現在這個類需要通過*.js文檔描述,在routes目錄下建立models.js檔案。

範例:建立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表關聯

範例:修改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) ;      // 位址重寫

                   }

         }) ;

};

         而且最為關鍵的是整個過程之中,不再去考慮資料庫的關閉問題,極大的友善了使用者開發。

4、總結

         可以發現,如果要實作Node.JS+ MongoDB開發,最為痛苦的地方就是各個元件包的管理,而且最麻煩的是Node.JS之中有上萬個元件包。

         使用這種輕量的開發方式絕對要比PHP + MySQL更加強大。

版權聲明:本文為小平果原創文章,轉載請注明:http://blog.csdn.net/i10630226