a.安裝mongoose庫用來鏈接mongodb數據庫
安裝mongodb數據庫參考mongodb安裝
前言(怨言)
本來是想安裝mongodb庫來鏈接mongodb的,命令行到nodejs工程目錄:npm install mongodb --save
但是發現報gyp ERR! stack Error:Can't find python executable "python"錯誤,缺少python運行環境。
我暈死,我鏈接mongodb還需要Python,這不是存心讓用戶找虐。查到有個網友說相同的庫還有mongoose, mongoskin,他們都比mongodb更有好用。果斷放棄mongodb,使用mongoos。
使用命令:npm install mongoose --save
一下ok了。
b.mongoose的使用
首先我們要知道mongoose建立數據庫有點類似普通的關系數據先定義結構,然后填寫字段,不想普通的noSql數據庫操作。所以這里有一些概念需要明白
-
Schema
: 一種以文件形式存儲的數據庫模型骨架,不具備數據庫的操作能力 -
Model
: 由Schema
發布生成的模型,具有抽象屬性和行為的數據庫操作對 -
Entity
: 由Model
創建的實體,他的操作也會影響數據庫
在使用mongoose構建和操作數據庫時,先定義數據庫每條數據(普通關系數據庫中的一行)的結構,也就是Schema,然后由Schema生成一個model。這個model擁有操縱由Schema結構構成的的整個表格中的數據的能力(包括增刪改查等)。可以由model創建一個個的實體數據,每個實體數據結構和Schema定義的結構相同。
下面直接上實例
//記賬本 var pocketBookSchema = new mongoose.Schema({ name: String, //定義一個屬性name,類型為String brand: String, //品牌 unitPrice: Number, //單價 quantity: Number, //數量 allPrice: Number, //總價 picture: String, //照片路徑 date: String, //日期"2016-01-01" _saveData: Date, //保存數據的日期 remark: String //備注 }); var pocketBookModel = db.model('pocketBook',pocketBookSchema); //如果該Model已經發布,則可以直接通過名字索引到,如下: //var pocketBookModel = db.model('pocketBook'); var info ={ name: req.body.name, brand: req.body.brand, unitPrice: req.body.unitPrice, quantity: req.body.quantity, allPrice: req.body.allPrice, picture: req.body.picture, date: req.body.date, remark: req.body.remark, _saveData: new Date() } //創建一個實例 pocketBookEntity = new pocketBookModel(info); //保存數據庫 pocketBookEntity.save(function(err) { if (err) { console.log('記賬本添加一條數據失敗'); return; } console.log('記賬本添加了一條數據'); });
上面就是使用mongoose添加一條數據的例子,當然,真實的項目中還需要連接mongodb數據庫,然后增刪改查都是通過url請求來處理的。本人這里舉一個完整的例子。
我的nodejs主程序是server.js,在同一級目錄下我新建了一個initdb.js用來鏈接數據庫和初始化所有需要用到的Schema和相應的model(這里只用了一個).
initdb.js源碼如下
var mongoose = require('mongoose'); //引用mongoose模塊 var db = mongoose.createConnection('192.168.0.174','chuayyqing'); db.on('error',console.error.bind(console,'連接錯誤:')); //記賬本 var pocketBookSchema = new mongoose.Schema({ name: String, //定義一個屬性name,類型為String brand: String, //品牌 unitPrice: Number, //單價 quantity: Number, //數量 allPrice: Number, //總價 picture: String, //照片路徑 date: String, //日期"2016-01-01" _saveData: Date, //保存數據的日期 remark: String //備注 }); var pocketBookModel = db.model('pocketBook',pocketBookSchema); //如果該Model已經發布,則可以直接通過名字索引到,如下: //var pocketBookModel = db.model('pocketBook'); exports.pocketBookModel = pocketBookModel;
server.js如下
var express = require("express"); var app = express(); var bodyParser = require('body-parser'); // 創建 application/x-www-form-urlencoded 編碼解析 var urlencodedParser = bodyParser.urlencoded({ extended: false }) var models = require("./initdb"); //指定靜態文件路勁static,可以直接訪問static下的文件test.png:http://localhost:8080/test.png app.use(express.static('chuayyqing/static')); //查詢記賬本列表 app.get("/pocketBook-list",function(req,res){ models.pocketBookModel.find(function(err,pockets){ res.send(pockets); }) }) //往記賬本添加一條記錄 app.post("/pocketBook-addOrUpdateOne",urlencodedParser,function(req,res){ /*info = { name: req.body.name, brand: req.body.brand, unitPrice: req.body.unitPrice, quantity: req.body.quantity, allPrice: req.body.allPrice, picture: req.body.picture, date: req.body.date, remark: req.body.remark, _saveData: new Date(); }*/ var info = req.body; info._saveData = new Date(); console.log(info) //有_id表示是更改一條數據 if(info._id){ var query = { _id: req.body._id }; models.pocketBookModel.findOneAndUpdate(query,info,function(err){ if (err) { console.log('記賬本修改一條數據失敗'); res.send({code:500}); return } console.log('記賬本修改了一條數據'); res.send({code:200}); }); //否則是新增一條數據 }else{ //如果沒有發布,上一段代碼將會異常 var pocketBookEntity = new models.pocketBookModel(info); //保存數據庫 pocketBookEntity.save(function(err) { if (err) { console.log('記賬本添加一條數據失敗'); res.send({code:500}); return; } console.log('記賬本添加了一條數據'); res.send({code:200}); }); } }) //刪除記賬本的一條記錄 app.post("/pocketBook-deleteOne",urlencodedParser,function(req,res){ models.pocketBookModel.remove({_id: req.body.id},function(err){ if (err) { console.log('記賬本刪除數據失敗'); res.send({code:500}); return; } console.log('記賬本刪除了一條數據'); res.send({code:200}); }) }) var server = app.listen(8080,function(){ var host = server.address().address; var port = server.address().port; console.log("應用實例,訪問地址為 http://%s:%s", host, port) })
增刪改查數操作上面就都有了。只要弄幾個簡單的網頁就可以把server.js跑起來了。
里面express的用法可以參考菜鳥教程expres基礎