看到一個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> 密 碼:<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