nodejs學習筆記二——鏈接mongodb


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基礎

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM