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> 密 碼:<input type="password" name="password" id="password"><br> <input type="submit" value="登陸"> <input type="reset" value="重置"> </form> </body> </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>
<!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進行相應的路由配置。
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 });
};
那麼在整個的基礎過程之中,最爲重要的步驟就配置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表關聯
範例:修改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) ; // 地址重寫 } }) ; }; |
並且最爲關鍵的是整個過程之中,再也不去考慮數據庫的關閉問題,極大的方便了用戶開發。