Node使用Mongoose操做MongoDB數據庫——增刪改查的實現

  當初剛出社會時就規劃了下本身的職業生涯:先成爲一名優秀的前端工程師,再成爲一名全棧工程師(精通前端開發、後臺開發和客戶端開發),最後成爲一名優秀的系統架構師。轉眼間已經工做快三年,是時候邁出關鍵性的一步了,開始涉足後端領域。因而最近在研究Node和Express,並研究瞭如何使用Express這個基於Node的Web開發框架開發RESTful API,以及Node如何鏈接MongoDB數據庫,先總結以下:javascript

 

(一)安裝Node和MongoDB

  1)到Node官網https://nodejs.org/下載最新版Node,或者直接點擊這裏下載。下載下來是一個後綴爲msi的文件,直接雙擊運行便可。安裝完在控制檯輸入:node -v,若是輸出版本號則說明安裝成功。css

  2)到MongoDB官網https://www.mongodb.com/下載最新版MongoDB,或者直接點擊這裏下載。下載下來也是一個msi文件,直接雙擊運行便可。html

 

(二)配置和開啓MongoDB數據庫

  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數據庫。數據庫

 

(三)一個CRUD的栗子

  爲了簡單起見,我就沒有寫那些表單、輸入框什麼的,數據直接在代碼裏改。

 

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

 

(四)總結

  至此,就實現了從數據庫到後臺,再到前端的整個編碼過程。

相關文章
相關標籤/搜索