文章出處

  又是一個簡單的小玩意兒, 不過有個大玩意兒,就是nosql的mongodb(文件大小:130M),  你要下載一個mongdodb, 去官方網站下載

  安裝以后在mongodb的命令行目錄下執行

mongod --dbpath=c:\mongodbInfo\ --port 27017

  這個命令會在C盤新建一個叫做mongodInfo的目錄用來保存mongodb的數據;

  nodeJS要安裝mongodb的依賴庫, 通過npm進行安裝

npm install mongodb

  mongodb的API可以通過這里查看,打開API

  這些是項目依賴, 其實就是express和mongodb這兩個, 剩下的都是express自帶的:

  "dependencies": {
    "cookie-parser": "~1.3.3",
    "debug": "~2.0.0",
    "body-parser": "~1.8.4",
    "express": "~4.9.8",
    "jade": "~1.6.0",
    "mongodb": "~1.3.23",
    "morgan": "~1.3.2",
    "serve-favicon": "~2.1.7"
  }

  完成的結果圖是這樣的:

  

  因為我們這盤弄得是數據庫, 所以起碼要有一個連接數據庫操作數據庫的函數, mongodb的數據庫接有很多種, 主要是因為版本不同, 接口有變, 但是還好的是高版本的數據庫連接方式有做向前兼容,

  這個模塊做的事情是 連接數據庫, 我們也可以通過實例化Col對collecionion(collectioninon就是mysql中的table)進行刪除添加collection:

//文檔地址:http://mongodb.github.io/node-mongodb-native/1.4/
//mongodb已經更新到了2.0了,我勒個去;
var  mongodb = require('mongodb');
//數據庫連接的配置
var MONGOURL = "mongodb://localhost:27017/";

var open = function(name, callback) {
    /*
    //1.2版本和1.4版本mongodb的連接方式;,2.0的mongodb連接有向前兼容;
    var  server  = new mongodb.Server('localhost', 27017, {auto_reconnect:true});
    var  db = new mongodb.Db(name, server, {safe:true});
     db.open(function(err, db){
         if(!err){
             console.log('connect db');
             callback&&callback(db);
        };
     });
    */
    // 這樣的連接方式還是比較好理解的;
    var MongoClient = require('mongodb').MongoClient;
    // name為數據庫的名字;
    var url = MONGOURL+ name;
    MongoClient.connect(url, function(err, db) {
        console.log('connect db');
        callback&&callback(db);
    });
};

/*
*   @param dbName;
*       instance    @method create(colname, callback);
*       instance    @method remove(colname, callback);
*       instance    @method getDb();
*/
var Col = function(name,callback) {
    //連接數據庫;
    open( name,function(_db) {
        this.db = _db;
        console.log("new db is done!")
        callback&&callback( _db );
    }.bind(this) );
};

Col.prototype = {
    constructor : Col,
    create : function( name, callback) {
        this.db.createCollection( name, {safe:true}, function(err, collection){
            if(err) {
                console.log(err);
            }else{
                callback&&callback(collection);
            };
        });
    },
    remove : function( name, callback) {
        this.db.dropCollection(name, {safe:true}, function(err,result) {
            if(err) {
                console.log(err);
                return;
            };
            callback&&callback(result);
        });
    },
    getDb : function() {
        return this.db;
    }
};

module.exports = Col;

 

 

   以及數據表的操作我給獨立出來Crud的js文件, 把Col回調的的數據庫作為參數傳進來就會返回一個對數據庫表進行刪改查增的方法, 接口參數為(collection的名字, 值, 回調函數):

  為nono這個表添加一條數據;
  crud.insert("nono" [{xx:xx}] , callback);
  更新nono這個表的所有hehe為1的所有字段為 lala為lala, 回調   crud.update("nono", {hehe1 : 1} , { lala : "lala" },function(){console.log("update Done")});   crud.remove("nono", {hehe : 0} ,function() {console.log("remove Done")});
  查找hehe為1的字段, 返回所有查找到的值;   crud.find("nono", {hehe1 : 1} ,function(doc) {}
  所有的API在github的mongodb-native項目下有對應的API,打開API
//文檔地址:http://mongodb.github.io/node-mongodb-native/1.4/
//mongodb已經更新到了2.0了,我勒個去;

var Crud = function(db) {
    this.db = db;
};
Crud.prototype  = {
    constructor : Crud,
    noop : function(){},
    //增加
    insert : function(col, val, cb) {
        cb = cb || this.noop;
        return this.db.collection(col).insert(val,cb);
    },
    //更新
    update : function(col, search, val, cb) {
        cb = cb || this.noop;
        return this.db.collection(col).update(search, {$set : val}, cb);
    },
    //刪除
    remove : function(col,key,cb) {
        cb = cb || this.noop;
        //console.log(this.db.collection(col).remove);
        return this.db.collection(col).remove(key,cb);
    },
    
    find : function(col,keyword,cb) {
        cb = cb || this.noop;
        this.db.collection(col).find(keyword).toArray(function(err, docs) {
            cb(docs);
        });
    },
    findBy_id : function(col,id, cb) {
        this.db.collection(col).find({},{_id : id}, function(err, docs){
            docs.toArray(function(err,doc){
                cb(doc)
            })
        })
    },
    findOne : function(col,keyword,cb) {
        cb = cb || this.noop;
        this.db.collection(col).findOne(keyword,function(err, docs) {
            cb(docs);
        })
    }
};

/*
 需要把題目的數據庫實例放進來;
 var crud = new Crud(db);
 var result = crud.insert("nono" [{xx:xx}] , callback);
 var result = crud.update("nono", {hehe1 : 1} , { lala : "lala" },function(){console.log("update Done")});
 var result = crud.remove("nono", {hehe : 0} ,function() {console.log("remove Done")});
 var result = crud.find("nono", {hehe1 : 1} ,function(doc) {}
 */
module.exports =  function(db) {
    return new Crud(db);
};

 

 

  界面的主要路由有首頁,刪除,添加,更新,這個四個, 我們要注意一下, 這里有個坑就是, 數據庫中查詢的id要通過 new ObjectId(id) 進行實例化以后的id, 你單單傳一個字符串id是一點用都沒有的:

var express = require('express');
var Col = require("../mongodb/Col.js");
var Crud = require("../mongodb/Crud.js");
var ObjectID = require('mongodb').ObjectID;

//路由是把第一個err給拿掉了;
var router = express.Router();

//初始化crud
var crud;
//新建DB并獲取;
var db =new Col("todo",function(db){
    //數據庫連接完畢...
    //創建一個RESTFUL對象;
    crud = new Crud( db, function(){} );
});
/*
var data = {
    title : "t0do",
    lists : [
    ]
};
*/

//這個可以理解為app.get("/",function(req, res, next){});
/* GET 獲取所有的列表. */
router.get('/', function(req, res) {
    //因為db的新建連接是異步的,所以你如果新建數據庫連接以后馬上getDb不會失效,你獲取的是undefined;
    crud.find("todos",{},function(docs) {
        console.log( docs );
        res.render('index', {title : "todos", lists : docs});
    });
});

/* GET 用戶選擇是否刪除指定ID. */
router.get('/del/:id', function(req, res) {
    res.render("delete",{id : req.params.id});
});

//用戶確認刪除指定id的todo
router.get("/del/ok/:id", function(req, res) {
    var crud = new Crud(db.getDb());
    var id = new ObjectID(req.params.id);

    crud.remove("todos",{_id : id}, function() {
        res.redirect("../../");
    });
});

//獲取編輯的todo信息界面
router.get('/modify/:id', function(req, res, next) {
    var _id = new ObjectID( req.params.id );
    crud.findOne("todos",{ _id : _id}, function(doc) {
        doc.id = doc._id;
        res.render("modify",doc);
    });
});

//更新用戶信息并重定向到主界面
router.post('/modify', function(req, res, next) {
    var body = req.body;
    console.log(body);
    crud.update("todos",{_id : new ObjectID(body.id)}, {_id:new ObjectID(body.id),title:body.title,content:body.content},function() {
        console.log("done");
    });
    res.redirect("../");
});

/* GET add listing. */
router.get('/add', function(req, res) {
    res.render("add",{});
});

//默認的post值為新建, 從add界面調過來的;
router.post("/add",function(req, res) {
    crud.insert("todos",[ {title : req.body.title, content : req.body.content }], function() {
        console.log("success");
    });
    res.redirect("./");
});

module.exports = router;

 

  demo的地址點擊這里下載;

  完了;


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()