国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

Nodejs使用Mongoose創建模型及API

來源:懂視網 責編:小采 時間:2020-11-27 19:59:28
文檔

Nodejs使用Mongoose創建模型及API

Nodejs使用Mongoose創建模型及API:這次給大家帶來Nodejs使用Mongoose創建模型及API ,Nodejs使用Mongoose創建模型及API的注意事項有哪些,下面就是實戰案例,一起來看一下。MongoDB是一種分布式文檔存儲型數據庫,和平時使用的關系型數據庫不同,它存儲的是BSON格式(json的二進制),
推薦度:
導讀Nodejs使用Mongoose創建模型及API:這次給大家帶來Nodejs使用Mongoose創建模型及API ,Nodejs使用Mongoose創建模型及API的注意事項有哪些,下面就是實戰案例,一起來看一下。MongoDB是一種分布式文檔存儲型數據庫,和平時使用的關系型數據庫不同,它存儲的是BSON格式(json的二進制),
這次給大家帶來Nodejs使用Mongoose創建模型及API ,Nodejs使用Mongoose創建模型及API的注意事項有哪些,下面就是實戰案例,一起來看一下。

MongoDB是一種分布式文檔存儲型數據庫,和平時使用的關系型數據庫不同,它存儲的是BSON格式(json的二進制),特點是高性能、易部署,易使用...(詳情請見百科),主要一點它支持JavaScript讀寫,MEAN棧開發的最大特點就是前后端包括數據庫都是JavaScript編寫。而Mongoose可以類比EntityFramwork(ORM-對象關系映射),主要做用是讓開發人員可以更方便的操作數據庫。在開始之前,記得先安裝mongodb。

一、MongoDB準備工作

1. mongo安裝完之后,用cmd切到安裝目錄下面的bin目錄。執行mongo,如果出現版本號則說明啟動成功:

如果是出現“計算機積極拒絕”,需要設置下dbpath,也就是指定數據的路徑。

mongod --dbpath=c:\mongodb\db

成功之后,可以訪問http://localhost:28017/ ,可以看到如下頁面:

說明一切就緒。

2.為避免每次開機完都要設置dbpath,需要將mongo設置為服務啟動。分兩步,先用管理員身份打開cmd,切到mongo的bin目錄:

D:\mongodb\bin>mongod --dbpath=D:\mongodb --logpath=D:\mongodb\log.txt --install

以上路徑更換成自己的路徑,然后在運行框中輸入services.msc。設置服務的時候要確保mongo在運行狀態,不然設置不會成功。

打開文件,找到Mongo DB:

右鍵選擇啟動,這樣每次開機mongo就會自動運行。

3.更方便點,可以在桌面創建一個star.bat文件:

@echo off
start "" "D:\mongodb-win32-i386-2.0.6\bin\mongo.exe"

這樣每次點擊直接進入命令框:

4.常用命令/基本操作

查看db:

show dbs

切換到某個數據庫:

switched to db dbname
或者:
use dbname

查看某個數據庫下的集合

show collections

查看集合下面的文檔:

db.collections.find()

因為這一節的重點不是要介紹如何在cmd中操作mongo,所以不再贅述了。更多這樣的細節可以參考一線碼農的博客:8天學通mongoDB。如果是沒有安裝sp1的電腦,官網的3.0版本安裝成功后無法運行,可以用2.xx免安裝版。接下來主要講Mongoose的操作。

二、Mongoose

1.安裝

你可以用npm直接安裝:

也可以用vs進行安裝。右鍵工程上的npm,選擇Install New npm Packages。

第一次會下載安裝一個工具,安裝完成之后,搜索Mongoose,出現下面的界面,并安裝。

2.建立連接

到這一步環境終于是準備好了,接下來在app_server 文件夾下創建一個models目錄,并新建一個db.js

并在db.js中引用Mongoose:

var mongoose = require('mongoose');

mongodb不需要在連接它之前創建數據庫,當第一次連接的時候,會根據鏈接自動創建。Mongoose在連接MongoDB的時候會創建一個有五個可重用的連接的連接池,連接數是可以配置的。這么做的原因是因為連接數據庫是比較耗時的操作,特別是分布式的數據庫。連接字符串的規則如下:

這里用戶名、密碼、端口都是可以省略的,那么在本地的時候我們的連接字符串就如下:

var dbURI = 'mongodb://localhost/RClub';
mongoose.connect(dbURI);

命名我們的數據庫為RClub。Mongoose會基于連接的狀態發布不同的事件:

mongoose.connection.on('connected', function () {
 console.log('Mongoose connected to ' + dbURI);
});
mongoose.connection.on('error', function (err) {
 console.log('Mongoose connection error: ' + err);
});
mongoose.connection.on('disconnected', function () {
 console.log('Mongoose disconnected');
});

如此我們可以監聽連接的狀態。另外應用終止需要監聽nodejs的進程的SIGINT事件。而如果是nodemon重啟,需要監聽的是SIGUSR2事件,以便關閉連接。

// 當應用重啟或終止的時候 關閉連接Shutdown = function (msg, callback) {
 mongoose.connection.close(function () {
 console.log('Mongoose disconnected through ' + msg);
 callback();
 });
};// nodemon 重啟 process.once('SIGUSR2', function () {
 Shutdown('nodemon restart', function () {
 process.kill(process.pid, 'SIGUSR2');
 });
});// 應用終止process.on('SIGINT', function () {
 Shutdown('app termination', function () {
 process.exit(0);
 });
});

View Code

運行nodemon:

顯示連接成功!

3.數據模型

Mongoose封裝了mongodb的api使之更便于調用,但作為MongoDB的對象-文檔建模器,有著更強大的功能。在mongodb中,每一個條目就是一個document,相當于關系型數據庫中的行,而document的集合稱為collection,相當于是關系型數據庫中的table。在Mongoose中定義一個document的對象稱為schema,相當于用EF定義一個Model,而定義schema中每一條數據的規則稱為path(約束)。path的規則和jquery.validate.js幾乎是一樣的。

path支持的數據類型如下:

  • String

  • Number

  • Date

  • Boolean

  • Buffer 二進制,比如圖形

  • Mixed 任何類型

  • Array 可以為數組,或者內嵌的 子文檔集

  • ObjectId 唯一id

  • 接下來演示下如何用Mongoose建一個數據模型,在models文件夾下創建一個books.js。然后引用Mongoose。如下,更具上一節book對象創建一個bookSchema 。

     {
     id: 0"深入淺出Node.js""樸靈 / 人民郵電出版社 / 2013-12-1 / CNY 69.00"5"https://img3.doubanio.com/mpic/s27269296.jpg""node", "深入淺出"'本書從不同的視角介紹了 Node 內在的特點和結構。.....9787115335500

    id不用創建,mongo會為每個document生成一個唯一的id。

    var mongoose = require('mongoose');var bookSchema = new mongoose.Schema({
     title: String,
     rating: {
     type: Number,
     required: true,
     min: 0,
     max: 5
     },
     info: String,
     img: String,
     tags: [String],
     brief: String,
     ISBN: String
    });

    這種語法是不是和jquery.validate.js很像,相信不用解釋就能看明白,不滿足path的條件時是不能保存或者更改的。每個path還可以設置默認值,比如時間:

     createdOn: {
     type: Date, default: Date.now
     },

    一個Schema可以包含另外的Schema或數組,在關系型數據庫中這種需求用的是外鍵或者是關系映射表,而Mongoose這樣看起來直觀多了。

    var userSchema = new mongoose.Schema({
    userName: String,
     email: String,
    ...});var commentSchema = new mongoose.Schema({
     user: userSchema,
     ...
     content: String
    });var topicSchema = new mongoose.Schema({
     ....
     visitedCount: { type: Number, default: 0 },
     ...
     comments: [commentSchema],
     deleted: { type: Boolean, default: false },
     top: { type: Boolean, default: false }, // 置頂帖 ...
    });

    這個時候的shema 還不具備數據庫的操作能力,還需要注冊下。

    mongoose.model('Book', bookSchema);
    mongoose.model('Topic', topicSchema);

    全部模型:

    var mongoose = require('mongoose');var bookSchema = new mongoose.Schema({
     title: String,
     rating: {
     type: Number,
     required: true,
     min: 0,
     max: 5
     },
     info: String,
     img: String,
     tags: [String],
     brief: String,
     ISBN: String
    });var userSchema = new mongoose.Schema({
     userName: String,
     email: String,
     password: String,
     createdOn: {
     type: Date, default: Date.now
     },
     img: String,
     ip: String,
     mobile: String
    });var commentSchema = new mongoose.Schema({
     user: userSchema,
     createdOn: {
     type: Date, default: Date.now
     },
     content: String
    });var topicSchema = new mongoose.Schema({
     title: String,
     type: String,
     visitedCount: { type: Number, default: 0 },
     commentCount: { type: Number, default: 0 },
     createdOn: {
     type: Date, default: Date.now
     },
     img: String,
     author: String,
     content: String,
     comments: [commentSchema],
     deleted: { type: Boolean, default: false },
     top: { type: Boolean, default: false }, // 置頂帖
     good: { type: Boolean, default: false }, // 精華帖});
    mongoose.model('Book', bookSchema);
    mongoose.model('Topic', topicSchema);

    View Code

    4.操作數據

    接下來就是改造controllers文件夾的中的home.js了,首先要引用db.js和Mongoose。

    var db = require('../models/db.js');var mongoose = require('mongoose');

    1).初始化數據,查詢與新建數據。

    這里把上一節創建的數據books和topics存入數據庫中:

    module.exports.init = function (req, res) { mongoose.model('Book').find().exec(function (err, objs) { if (err) {
     res.render('error', {
     message: err.message,
     error: err
     }); return;
     } if (objs.length) { 
     for (var i = 0; i < books.length; i++) { var taget = new Bookmodel(books[i]);//創建一個模型 taget.save(function (err) {//保存。
     console.log(err);
     });
     } 
     for (var i = 0; i < topics.length; i++) { var taget = new topicmodel(topics[i]);
     console.log('topic create');
     taget.save(function (err) {
     console.log(err);
     });
     }
     res.send('初始化完成...');
     }
     res.render('books', { title: 'Books', books: objs });
     });

    這段代碼里面有查詢和新建保存,mongoose.model("Book") 相當于EF中的db.Books。而這里的find()方法并沒有立即執行,這里有點像Linq的感覺,可以鏈式查詢:

    Book.find({ size: 'small' }).where('createdDate').gt(oneYearAgo).exec(callback);//例子,和上面的book沒有關系

    這里Book相當于mongoose.model("Book") ,而{ size: 'small' }是一個條件。最終到exec方法時才正在執行。回調函數默認有兩個參數,一個是err,一個是結果對象。這里偷了懶只判斷了books的查詢結果,集合為空的話就加上原來的數據。因為mongoose.model("Book")使用的比較多,所以干脆提出來:

    var Bookmodel = mongoose.model('Book');var Topicmodel = mongoose.model('Topic');

    find方法是查詢一個集合,常用的還有findone:

    var query = Person.findOne({ 'name.last': 'Ghost' });// 選擇name和occupation 字段query.select('name occupation');// 執行查詢query.exec(function (err, person) { if (err) return handleError(err);
     console.log('%s %s is a %s.', person.name.first, person.name.last, person.occupation) 
    })

    保存數據,new一個Model,傳入初始化的對象,save即可。

     var taget = new Bookmodel(books[i]);
     taget.save(function (err) {
     console.log(err);
     });

    配置下路由:

    router.get('/init', homeController.init);

    運行:

    因此數據添加成功!

    三、app_api

    為方便后面復用,接下來將數據調用換成api的方式。在工程里面新建一個app_api文件夾,并將原來app_server目錄下的models文件移過去。并增加controllers和routes文件夾。也就是說,把數據調用分離出來。

    1)在app.js中增加以下代碼:

    var routesApi = require('./app_api/routes/index');...
    app.use('/', routes);app.use('/api', routesApi);

    也就是說,所有以/api/xx開始的請求將由routes/index.js來路由。

    2)在routes文件下新增index.js 文件,用來配置api的路由:

    var express = require('express');var router = express.Router();var bookCtrl = require('../controllers/book');var topicCtrl = require('../controllers/topic');
    router.get('/books', bookCtrl.books);
    router.post('/book', bookCtrl.bookCreate);
    router.get('/book/:bookid', bookCtrl.bookReadOne);
    router.put('/books/:bookid', bookCtrl.bookUpdateOne);
    router.delete('/books/:bookid', bookCtrl.bookDeleteOne);//topicsrouter.get('/topics', topicCtrl.topics);
    module.exports = router;

    路由覆蓋了增刪改查,暫時先實現這部分的路由。后面根據需求再增加。

    3)controller實現

    一個成功的Restful API應該包含返回的數據和http的狀態碼,因此我們定義了一個公用方法:

    var sendJSONresponse = function (res, status, content) {
     res.status(status);
     res.json(content);
    };

    比如定義一個bookReadOne方法:

    module.exports.bookReadOne = function (req, res) { var bookid = req.params.bookid; if (!bookid) {
     sendJSONresponse(res, 404, { "message": "Not found, bookid is required"
     }); return;
     }
     BookModel.findById(bookid).exec(function (err, book) { if (!book) {
     sendJSONresponse(res, 404, { "message": "bookid not found"
     }); return;
     } else if (err) { sendJSONresponse(res, 400, err); return;
     }
     console.log(book); sendJSONresponse(res, 200, book);
     });
    }

    請求成功發送狀態碼200和結果,請求失敗則發送404或者500及錯誤。

    books.js:

    var mongoose = require('mongoose');var BookModel = mongoose.model('Book');var sendJSONresponse = function (res, status, content) {
     res.status(status);
     res.json(content);
    };
     
    module.exports.books = function (req, res) {
     BookModel.find().exec(function (err, books) { if (err) {
     console.log(err);
     sendJSONresponse(res, 400, err); return;
     }
     sendJSONresponse(res, 200, books);
     });
    }
    module.exports.bookCreate = function (req, res) {
     BookModel.create({
     title: req.body.title,
     info: req.body.info,
     img: req.body.img,
     tags: req.body.tags,
     brief: req.body.brief,
     ISBN: req.body.ISBN
     }, function(err, book) { if (err) {
     console.log(err);
     sendJSONresponse(res, 400, err);
     } else {
     console.log(book);
     sendJSONresponse(res, 201, book);
     }
     });
    }
    module.exports.bookReadOne = function (req, res) { var bookid = req.params.bookid; if (!bookid) {
     sendJSONresponse(res, 404, { "message": "Not found, bookid is required"
     }); return;
     }
     BookModel.findById(bookid).exec(function (err, book) { if (!book) {
     sendJSONresponse(res, 404, { "message": "bookid not found"
     }); return;
     } else if (err) {
     sendJSONresponse(res, 400, err); return;
     }
     console.log(book);
     sendJSONresponse(res, 200, book);
     });
    }
    module.exports.bookUpdateOne = function (req, res) { var bookid = req.params.bookid; if (!bookid) {
     sendJSONresponse(res, 404, { "message": "Not found, bookid is required"
     }); return;
     }
     BookModel.findById(bookid).exec(function (err, book) { if (!book) {
     sendJSONresponse(res, 404, { "message": "bookid not found"
     }); return;
     } else if (err) {
     sendJSONresponse(res, 400, err); return;
     }
     book.title = req.body.title;
     book.rating = req.body.rating;
     book.info = req.body.info;
     book.img = req.body.img;
     book.tags = req.body.tags;
     book.brief = req.body.brief;
     book.ISBN = req.body.ISBN;
     book.save(function (err, book) { if (err) {
     sendJSONresponse(res, 404, err);
     } else {
     sendJSONresponse(res, 200, book);
     }
     });
     });
    }
    module.exports.bookDeleteOne = function (req, res) { var bookid = req.params.bookid; if (bookid) {
     BookModel.findByIdAndRemove(bookid)
     .exec(function (err) { if (err) {
     console.log(err);
     sendJSONresponse(res, 404, err); return;
     }
     console.log("book id :" + bookid + "deleted");
     sendJSONresponse(res, 204, null);
     });
     } else {
     sendJSONresponse(res, 404, { message: "No bookid" });
     }
    }

    View Code

    這樣注意一點是,find()、findbyid和findByIdAndRemove不是立即執行,是在exec方法中執行,但是create,save是立即執行的。

    5)、調用api

    接下來就是在app_server下的controller中調用上面定義的api。在這里需要安裝一個request模塊,request讓http請求變的更加簡單。

    在home.js中引用request:

    var request = require('request');

    request的調用如下:

    request(options, callback)

    包含options和回調兩部分,options結構如下,包含url,method,json和qs四部分。

    var requestOptions = {
    url : "http://yourapi.com/api/path",
    method : "GET",
    json : {}, //請求體的JavaScript對象qs : {
    offset : 20 //查詢字符串}
    };

    而默認的回調格式如下:

    function(err, response, body) {if (err) {
    console.log(err);
    } else if (response.statusCode === 200) {
    console.log(body);
    } else {
    console.log(response.statusCode);
    }
    }

    修改index方法,先定義一個apiOptions,只想默認路徑,記得在發布的時候修改為帶域名的地址。

    var apiOptions = {
     server : "http://localhost:3000"};
    module.exports.index = function (req, res) { var requestOptions, path;
     path = "/api/topics";
     requestOptions= {
     url: apiOptions.server + path,
     method: "GET",
     json:{},
     }
     request(requestOptions, function (err, response, body) { if (response.statusCode == 200) {
     res.render('index', { title: 'Index', topics: body });
     } else {
     res.render('error', { message: err.message, error: err });
     }
     });
    };

    這樣就進行了分離,home.js不在需要引用Mongoose部分。

    home.js:

    var request = require('request');var apiOptions = {
     server : "http://localhost:3000"};//if (process.env.NODE_ENV === 'production') {// apiOptions.server = "https://stoneniqiu-mean.herokuapp.com/ ";//}module.exports.index = function (req, res) { var requestOptions, path;
     path = "/api/topics";
     requestOptions= {
     url: apiOptions.server + path,
     method: "GET",
     json:{},
     }
     request(requestOptions, function (err, response, body) { if (response.statusCode == 200) {
     res.render('index', { title: 'Index', topics: body });
     } else {
     res.render('error', { message: err.message, error: err });
     }
     });
    };
    module.exports.books = function (req, res) { var requestOptions, path;
     path = "/api/books";
     requestOptions = {
     url: apiOptions.server + path,
     method: "GET",
     json: {},
     }
     request(requestOptions, function (err, response, body) { if (response.statusCode == 200) {
     res.render('books', { title: 'Books', books: body });
     } else {
     res.render('error', { message: err.message, error: err });
     }
     });
    };
    module.exports.detail = function (req, res) { var requestOptions, path;
     path = "/api/book/" + req.params.id;
     requestOptions = {
     url: apiOptions.server+path ,
     method: "GET",
     json: {},
     }
     request(requestOptions, function (err, response, body) { if (response.statusCode == 200) {
     res.render('detail', { title: body.title, book: body });
     } else {
     res.render('info', err);
     }
     });
     
     };
    module.exports.about = function (req, res) {
     res.render('about', { title: 'About' });
    };

    View Code

    更多查詢可以移步:http://mongoosejs.com/docs/queries.html

    在首頁,需要處理一下時間顯示的問題,增加了一個mixin

    mixin formatDate(dateString) -var date = new Date(dateString); -var d = date.getDate(); -var monthNames = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12" ]; -var m = monthNames[date.getMonth()]; -var y = date.getFullYear(); -var output = y + '/' + m + '/' + d; =output

    調用:

     span.pull-right +formatDate(topic.createdOn)

    頁面如下:

    初步改造完成。之前還寫了一個基于回調的service方式的controller和service,類似于C#中的分離。后來覺得還是api的方式更好,留在這里可以當一個參考。

    home.js:

    var bookservice = require('../services/homeService.js');
     
    module.exports.index = function (req, res) {
     bookservice.allTopics(function (result) {
     var obj = result.content;
     console.log(obj.status); if (result.status == 200) {
     res.render('index', { title: 'Index', topics: obj });
     }
     res.render('info', obj);
     }); 
    };
    module.exports.books = function (req, res) {
     bookservice.allBooks(function(result) {
     var obj = result.content;
     console.log(obj.status); if (result.status == 200) {
     res.render('books', { title: 'Books', books: obj });
     }
     res.render('info', obj);
     }); 
    };
    module.exports.detail = function (req, res) {
     bookservice.bookReadOne(req.params.id, function (result) {
     var obj = result.content; if (result.status == 200) {
     res.render('detail', { title: obj.title, book: obj });
     } 
     res.render('info', obj);
     });
     };
    module.exports.about = function (req, res) {
     res.render('about', { title: 'About' });
    };

    View Code

    homeService.js:

    var mongoose = require('mongoose');var db = require('../models/db.js');var Bookmodel = mongoose.model('Book');var Topicmodel = mongoose.model('Topic');var jsonResult = function (status, content) { return { status: status, content: content };
    };
    module.exports.bookReadOne = function (id,callback) {
     console.log('Finding book details', id); if (!id) {
     console.log('No bookid specified'); return jsonResult(404, { "message": "No bookid specified" });
     }
     Bookmodel.findById(id).exec(function (err, book) { if (err) {
     callback(jsonResult(404, err)); return;
     } if (!book) {
     callback(jsonResult(404, { "message": "book not found" })); return;
     }
     callback(jsonResult(200, book));
     });
    };
    module.exports.allBooks=function(callback) {
     Bookmodel.find().exec(function (err, books) { if (err) {
     callback(jsonResult(404, err)); return;
     } if (!books.length) {
     callback(jsonResult(404, { "message": "books not found" })); return;
     }
     callback(jsonResult(200, books));
     });
    }
    module.exports.createBook = function (book, callback) { var t = new Bookmodel(book);
     t.save(function (err) {
     callback(err);
     });
    }
    module.exports.allTopics=function(callback) {
     Topicmodel.find().exec(function (err, topics) { if (err) {
     callback(jsonResult(404, err)); return;
     } if (!topics.length) {
     callback(jsonResult(404, { "message": "topics not found" })); return;
     }
     callback(jsonResult(200, topics));
     });
    }
    module.exports.createTopic=function(topic, callback) { var t = new Topicmodel(topic);
     t.save(function(err) {
     callback(err);
     });
    }var books = [
     {
     id: 0,
     title: "深入淺出Node.js",
     info: "樸靈 / 人民郵電出版社 / 2013-12-1 / CNY 69.00",
     rating: 5,
     img: "https://img3.doubanio.com/mpic/s27269296.jpg",
     tags: ["node", "深入淺出"],
     brief: '本書從不同的視角介紹了 Node 內在的特點和結構。由首章Node 介紹為索引,涉及Node 的各個方面,主要內容包含模塊機制的揭示、異步I/O 實現原理的展現、異步編程的探討、內存控制的介紹、二進制數據Buffer 的細節、Node 中的網絡編程基礎、Node 中的Web 開發、進程間的消息傳遞、Node 測試以及通過Node 構建產品需要的注意事項。最后的附錄介紹了Node 的安裝、調試、編碼規范和NPM 倉庫等事宜。本書適合想深入了解 Node 的人員閱讀。'
     ,ISBN: 9787115335500
     },
     {
     id: 1,
     title: "程序員修煉之道 : 從小工到專家",
     info: "Andrew Hunt、David Thomas / 馬維達 / 電子工業出版社 / 2005-1 / 48.00元",
     rating: 5,
     img: "https://img3.doubanio.com/mpic/s3957863.jpg",
     tags: ["程序人生", "軟件開發"],
     brief: '《程序員修煉之道》由一系列的獨立的部分組成,涵蓋的主題從個人責任、職業發展,直到用于使代碼保持靈活、并且易于改編和復用的各種架構技術。利用許多富有娛樂性的奇聞軼事、有思想性的例子以及有趣的類比,全面闡釋了軟件開發的許多不同方面的最佳實踐和重大陷阱。無論你是初學者,是有經驗的程序員,還是軟件項目經理,本書都適合你閱讀。'
     ,ISBN: 9787505397194
     },
     {
     id: 2,
     title: "Getting MEAN with Mongo, Express, Angular, and Node",
     info: "Simon Holmes / Manning Publications / 2015-11-26 / USD 44.99",
     rating: 4,
     img: "https://img3.doubanio.com/mpic/s27676844.jpg",
     tags: ["node", "web開發", "編程"],
     brief: 'MEAN棧開發,比較詳盡的的應用開發書籍'
     , ISBN: 9781617292033
     }
    ];var topics = [
     {
     title: "書山有路第十一期:程序員修煉之道-第二章-注重實效的途徑--第五天",
     type: "讀書",
     visitedCount: 80,
     commentCount: 2,
     createdOn: '2016/5/15 21:32',
     author: 'stoneniqiu',
     img: 'http://upload.jianshu.io/users/upload_avatars/133630/d5370e672fd4.png?imageMogr/thumbnail/90x90/quality/100'
     },
     {
     title: "《明朝那些事兒》之閑言散語",
     type: "書評",
     visitedCount: 180,
     commentCount: 20,
     createdOn: '2016/5/15 21:32',
     author: '卡卡卡薩布蘭卡 ',
     img: 'http://upload.jianshu.io/users/upload_avatars/1675188/2d0810ccc03d.jpg?imageMogr/thumbnail/90x90/quality/100'
     },
     {
     title: "有《程序員修煉之道》高清版嗎?",
     type: "求書",
     visitedCount: 90,
     commentCount: 1,
     createdOn: '2016/5/15 21:32',
     author: '吾不知 ',
     img: 'http://upload.jianshu.io/users/upload_avatars/1125491/3910f3825f73.jpg?imageMogr/thumbnail/90x90/quality/100',
     },
     {
     title: "《國富論》-讀書筆記",
     type: "書評",
     visitedCount: 180,
     commentCount: 20,
     createdOn: '2016/5/15 21:32',
     author: '尋海 '
     ,img: 'http://upload.jianshu.io/users/upload_avatars/133630/d5370e672fd4.png?imageMogr/thumbnail/90x90/quality/100'
     },
     {
     title: "《高效人士的七個習慣》讀書筆記",
     type: "書評",
     visitedCount: 180,
     commentCount: 20,
     createdOn: '2016/5/15 21:32',
     author: '書蟲紀慶 ',
     img: 'http://upload.jianshu.io/users/upload_avatars/1429280/454c495361f9.jpg?imageMogr/thumbnail/90x90/quality/100'
     },
     {
     title: "《css揭秘》這本書如何",
     type: "求索",
     visitedCount: 58,
     commentCount: 3,
     createdOn: '2016/5/15 21:32',
     author: 'Watery_D_Lotus ',
     img: 'http://upload.jianshu.io/users/upload_avatars/1449533/a2d98762484a.jpg?imageMogr/thumbnail/90x90/quality/100'
     }
    ];//module.exports.bookCreate = function (req, res) {// var book = {// title: "test",// info: "Simon Holmes / Manning Publications / 2015-11-26 / USD 44.99",// rating: 4,// img: "https://img3.doubanio.com/mpic/s27676844.jpg",// tags: ["node", "web開發", "編程"],// brief: 'MEAN棧開發,比較詳盡的的應用開發書籍',// ISBN: 9781617292033// };// var b = new Bookmodel(book);// b.save(function (err) {// if (err) {// console.log(err);// res.render('error', {// message: err.message,// error: err// });// }// res.render('info', { message: "添加成功!", success: true });// });//};//module.exports.bookDelete = function (req, res) {// Bookmodel.findOneAndRemove({ title: "test" }, function (err) {// if (err) {// console.log(err);// res.render('error', {// message: err.message,// error: err// });// }// res.render('info', { message: "刪除成功!", success: true });// });//};

    View Code

    至此,這三個頁面的數據全部都是通過api從數據庫中獲取。那么現在我們要發布,本地數據庫顯然是不行。那怎么辦呢?

    四、mlab,500M MongoDB免費空間!

    mlab是一個提供部署在云端的mongodb數據庫服務平臺,可以對每個用戶免費提供500M空間。

    1. 先注冊一個賬號:https://mlab.com/,并驗證郵箱:

    2.點擊Create new創建數據庫:這里選擇亞馬遜的單用戶sanbox會有免費的500M空間。

    輸入數據庫名稱,并創建

    3.創建成功之后,給數據庫創建一個用戶

    4.連接字符串:

    第一個字符串是用cmd連接,第二個用于我們的程序。修改db.js 連接成功:

    相信看了本文案例你已經掌握了方法,更多精彩請關注Gxl網其它相關文章!

    推薦閱讀:

    怎樣用nodejs搭建服務器

    vue2全家桶是什么,如何使用?

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    Nodejs使用Mongoose創建模型及API

    Nodejs使用Mongoose創建模型及API:這次給大家帶來Nodejs使用Mongoose創建模型及API ,Nodejs使用Mongoose創建模型及API的注意事項有哪些,下面就是實戰案例,一起來看一下。MongoDB是一種分布式文檔存儲型數據庫,和平時使用的關系型數據庫不同,它存儲的是BSON格式(json的二進制),
    推薦度:
    標簽: 使用 js API
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产精品一区二区不卡 | 亚洲视频一区二区 | 欧美日韩三区 | 亚洲欧美另类专区 | 国产不卡的一区二区三区四区 | 伊人逼逼 | 国产视频第一页 | 国产在线一区二区三区 | 毛片福利视频 | 欧美日本在线观看 | 一97日本道伊人久久综合影院 | 久久久影院亚洲精品 | 日本精品一区二区三区在线观看 | 欧美伦禁片在线播放 | 久久91精品国产一区二区 | 亚洲欧美自拍偷拍 | 亚洲欧美日韩高清一区二区一 | 国产手机在线国内精品 | 欧美日韩国产三级 | 黄色一级视频免费 | 波多野氏免费一区 | 国产精品亚洲一区二区三区在线播放 | 国产欧美成人一区二区三区 | 正在播放国产一区 | 国产午夜电影在线观看 | 欧美日韩在线观看一区二区 | 欧美 日韩 中文字幕 | 欧美第5页| 免费在线欧美 | 国产亚洲视频在线 | 亚洲国产成人久久99精品 | 国产日韩视频在线 | 一级特黄女毛毛片 | 国产激情一区二区三区成人91 | 中文国产成人精品少久久 | 亚洲国产成人精品91久久久 | 日韩精品在线免费观看 | 日韩高清一区二区 | 99久久99这里只有免费的精品 | 国产人成久久久精品 | 久久免费看视频 |