nodejs學習筆記二鏈接mongodb
來自: http://www.cnblogs.com/chuaWeb/p/5174951.html
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('記賬本添加了一條數據');
});</pre>
上面就是使用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;</pre>
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)
})</pre>
增刪改查數操作上面就都有了。只要弄幾個簡單的網頁就可以把server.js跑起來了。
里面express的用法可以參考 菜鳥教程expres基礎
如果覺得本文不錯,請點擊右下方【推薦】!
</div>