當初剛出社會時就規劃了下本身的職業生涯:先成爲一名優秀的前端工程師,再成爲一名全棧工程師(精通前端開發、後臺開發和客戶端開發),最後成爲一名優秀的系統架構師。轉眼間已經工做快三年,是時候邁出關鍵性的一步了,開始涉足後端領域。因而最近在研究Node和Express,並研究瞭如何使用Express這個基於Node的Web開發框架開發RESTful API,以及Node如何鏈接MongoDB數據庫,先總結以下:javascript
1)到Node官網https://nodejs.org/下載最新版Node,或者直接點擊這裏下載。下載下來是一個後綴爲msi的文件,直接雙擊運行便可。安裝完在控制檯輸入:node -v,若是輸出版本號則說明安裝成功。css
2)到MongoDB官網https://www.mongodb.com/下載最新版MongoDB,或者直接點擊這裏下載。下載下來也是一個msi文件,直接雙擊運行便可。html
1)在D盤新建一個mongodb文件夾,並新建兩個子文件夾mongodb/bin和mongodb/db。前端
2)在C盤找到MongoDB的安裝目錄,將C:\Program Files\MongoDB\Server\3.2\bin路徑下的全部文件拷貝到D:/mongodb/bin下。java
3)打開控制檯,切換到D:/mongodb/bin目錄,輸入:node
D:\mongodb\bin>D:/mongodb/bin/mongod --dbpath=D:/mongodb/db
4)另外再打開一個控制檯窗口,切換到D:/mongodb/bin目錄,輸入:jquery
D:\mongodb\bin>D:/mongodb/bin/mongo
運行MongoDB。ajax
這時會進入MongoDB的交互模式,輸入:mongodb
> use test
switched to db test
新建了一個test數據庫。數據庫
爲了簡單起見,我就沒有寫那些表單、輸入框什麼的,數據直接在代碼裏改。
1.目錄結構
2.入口文件app.js
1)咱們須要安裝一些外部模塊:express、express3-handlebars、mongoose、body-parser、supervisor(非必需)
Administrator@kagolzeng-PC1 MINGW64 /d/Code/FullStack/mongoose $ npm install --save express express3-handlebars mongoose body-parser
Administrator@kagolzeng-PC1 MINGW64 /d/Code/FullStack/mongoose $ npm install -g supervisor
2)引入express、body-parser和movie.js
1 var express = require('express'); 2 var bodyParser = require('body-parser'); 3 //數據操做對象 4 var Movie = require('./public/server/js/movie');
其中movie.js是爲了方便數據操做,避免重複代碼,抽出來的一個模塊。
3)定義express對象app和設置靜態文件路徑等
1 var app = express(); 2 app.use(express.static(__dirname + '/public'));//設置靜態文件路徑 3 app.use(bodyParser());//用來解析req.body參數的
4)設置模板引擎
1 //設置模板引擎,這裏用的是handlebars模板 2 var handlebars = require('express3-handlebars').create({ 3 defaultLayout: 'main'//默認佈局(母版頁),默認從views/layouts/main.handlebars中找文件 4 }); 5 app.engine('handlebars', handlebars.engine); 6 app.set('view engine', 'handlebars');
5)定義路由
1 //定義路由 2 app.get('/', function(req, res){ 3 Movie.find(function(err, docs){ 4 res.render('home', {//渲染視圖,默認從views/home.handlebars中找文件 5 movies: docs 6 });//向home頁面傳入了movies變量 7 }); 8 }); 9 app.get('/about', function(req, res){ 10 res.render('about'); 11 });
6)定義API接口
1 //定義API接口 2 //新增接口 3 app.post('/add', function(req, res){ 4 var movie = new Movie({//定義一個模塊實例 5 title: req.body.title, 6 doctor: req.body.doctor, 7 year: req.body.year, 8 country: req.body.country, 9 language: req.body.language, 10 summary: req.body.summary 11 }); 12 movie.save(function(err){ 13 if(err){ 14 console.log('保存失敗'); 15 } 16 console.log('保存成功'); 17 res.json({ ret: 0, msg: 'succeed' }); 18 }); 19 }); 20 //更新接口 21 app.post('/update', function(req, res){ 22 var id = req.body.id; 23 if(id){ 24 Movie.update({ 25 _id: id 26 }, { 27 $set: { 28 title: req.body.title, 29 doctor: req.body.doctor, 30 year: req.body.year, 31 country: req.body.country, 32 language: req.body.language, 33 summary: req.body.summary 34 } 35 }, function(err){ 36 if(err){ 37 console.log(err); 38 return; 39 } 40 console.log('更新成功'); 41 res.json({ ret: 0, msg: 'succeed' }); 42 }); 43 } 44 }); 45 //刪除接口 46 app.post('/delete', function(req, res){ 47 var id = req.body.id; 48 if(id){ 49 Movie.remove({ 50 _id: id 51 },function(err){ 52 if(err){ 53 console.log(err); 54 return; 55 } 56 console.log('刪除成功'); 57 res.json({ ret: 0, msg: 'succeed' }); 58 }); 59 } 60 }); 61 //根據ID獲取單條數據的接口 62 app.post('/getMovieById', function(req, res){ 63 Movie.findById(req.body.id, function(err, doc){ 64 res.json(doc); 65 }); 66 });
7)錯誤頁
1 //如下兩個中間價是用來展現錯誤頁的 2 app.use(function(req, res, next){ 3 res.status(404); 4 res.render('404'); 5 }); 6 app.use(function(err, req, res, next){ 7 res.status(505); 8 res.render('505'); 9 });
8)監聽端口
1 //監聽3000端口 2 app.listen(3000); 3 console.log('在瀏覽器中輸入localhost:3000訪問系統首頁');
3.movie.js數據操做模塊
1 var mongoose = require('mongoose'); 2 mongoose.connect('mongodb://localhost/test');//鏈接到test數據庫 3 var Schema = mongoose.Schema; 4 var movieSchema = new Schema({//定義框架 5 title: String, 6 doctor: String, 7 year: Number, 8 country: String, 9 language: String, 10 summary: String 11 }); 12 var Movie = mongoose.model('Movie', movieSchema);//定義模塊 13 module.exports = Movie;//導出模塊,使外部能夠調用
這裏要注意的是定義模塊的第一個參數並非數據庫的名稱,這裏對應的數據庫名稱是:movies。
4.佈局(母版頁)main.handlebars
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Home</title> 6 <script src="http://code.jquery.com/jquery.min.js"></script> 7 <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"> 8 </head> 9 <body> 10 {{{body}}} 11 <script src="/client/js/index.js"></script> 12 </body> 13 </html>
5.各個視圖文件
1)home.handlebars
1 <h1>Welcome to Meadowlark Travel</h1> 2 <div><a href="javascript:;" id="btn_add" class="btn btn-primary">Add</a></div> 3 <div><a href="javascript:;" id="btn_update" class="btn btn-primary">Update</a></div> 4 <div><a href="javascript:;" id="btn_delete" class="btn btn-primary">Delete</a></div> 5 <table class="table"> 6 <tr> 7 <th>ID</th> 8 <th>Title</th> 9 <th>Doctor</th> 10 <th>Year</th> 11 <th>Country</th> 12 <th>Language</th> 13 <th>Summary</th> 14 </tr> 15 {{#each movies}} 16 <tr> 17 <td>{{_id}}</td> 18 <td>{{title}}</td> 19 <td>{{doctor}}</td> 20 <td>{{year}}</td> 21 <td>{{country}}</td> 22 <td>{{language}}</td> 23 <td>{{summary}}</td> 24 </tr> 25 {{/each}} 26 </table>
2)about.handlebars
<h1>About Meadowlark Travel</h1>
3)404.handlebars
<h1>404 - Not Found</h1>
4)505.handlebars
<h1>505 - Internal Error</h1>
6.jQuery風格的Ajax請求文件index.js
1 $('#btn_add').on('click', function(){ 2 $.ajax({ 3 url: '/add', 4 type: 'post', 5 data: { 6 title: 'Sudu7', 7 doctor: 'Jack', 8 year: '2015', 9 country: 'America', 10 language: 'English', 11 summary: 'Great' 12 }, 13 success: function(data){ 14 console.log(JSON.stringify(data)); 15 } 16 }); 17 }); 18 $('#btn_update').on('click', function(){ 19 $.ajax({ 20 url: '/update', 21 type: 'post', 22 data: { 23 id: '5731af54a2b840a83f2f26d3 ', 24 title: '極盜者', 25 doctor: '羅傑斯', 26 year: '2015', 27 country: 'America', 28 language: 'English', 29 summary: '極限運動' 30 }, 31 success: function(data){ 32 console.log(JSON.stringify(data)); 33 } 34 }); 35 }); 36 $('#btn_delete').on('click', function(){ 37 $.ajax({ 38 url: '/delete', 39 type: 'post', 40 data: { 41 id: '5731ad259ad2c8882ecb87c2' 42 }, 43 success: function(data){ 44 console.log(JSON.stringify(data)); 45 } 46 }); 47 }); 48 $.ajax({ 49 url: '/getMovieById', 50 type: 'post', 51 data: { 52 id: '57328a0101c4095818fb1724' 53 }, 54 success: function(data){ 55 console.log(JSON.stringify(data)); 56 } 57 });
至此,就實現了從數據庫到後臺,再到前端的整個編碼過程。