標籤:
又是一個簡單的小玩意兒, 不過有個大玩意兒,就是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();//初始化crudvar 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的todorouter.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的地址點擊這裡下載;
完了;
nodeJS+bootstarp+mongodb整一個TODO小例子