设为首页 收藏本站
查看: 1218|回复: 0

[经验分享] nodeJS+bootstarp+mongodb整一个TODO小例子

[复制链接]

尚未签到

发表于 2015-7-6 08:43:44 | 显示全部楼层 |阅读模式
  又是一个简单的小玩意儿, 不过有个大玩意儿,就是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"
}
  完成的结果图是这样的:
DSC0000.png DSC0001.png DSC0002.png
  因为我们这盘弄得是数据库, 所以起码要有一个连接数据库操作数据库的函数, 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的地址点击这里下载;
    完了;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83590-1-1.html 上篇帖子: Nodejs与mongodb 下篇帖子: 论nodejs与mongodb
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表