又是一个简单的小玩意儿, 不过有个大玩意儿,就是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的地址点击这里下载;

  完了;

nodeJS+bootstarp+mongodb整一个TODO小例子的更多相关文章

  1. 关于ExpandableListView用法的一个简单小例子

    喜欢显示好友QQ那样的列表,可以展开,可以收起,在android中,以往用的比较多的是listview,虽然可以实现列表的展示,但在某些情况下,我们还是希望用到可以分组并实现收缩的列表,那就要用到an ...

  2. 使用NodeJS+AngularJS+MongoDB实现一个Web数据扒取-分析-展示的系统

    说到Web爬虫,Python占了半壁江山.但是Web页面不是Python的强项了,如果需要扒取Web数据,再Mashup出来一个自己的系统,全端JS是个不错的解决方案(其实不用Python扒数据是因为 ...

  3. 第一个servlet小例子

    1.sendForward.jsp <%@ page language="java" contentType="text/html; charset=UTF-8&q ...

  4. hibernate一个注册小例子

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXUAAAJ2CAIAAAAv44WsAAAgAElEQVR4nO29a3QUVaL33fPhfHrW8y

  5. 使用 Suricata 进行入侵监控(一个简单小例子访问百度)

    前期博客 基于CentOS6.5下Suricata(一款高性能的网络IDS.IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐) 1.自己编写一条规则,规则书写参考snort规则(suricata ...

  6. nodejs 操作mongodb, 增删改查

    很久没有学node了,之前书看了一半,今天继续学发现版本问题很坑爹,按书例子执行一堆错误.想学nodejs操作db,百度半天,一堆sb写神马鸟玩儿?简简单单写一大堆还运行不了的.需要代码也是看别人写的 ...

  7. 一个Hibernate小程序

    基本步骤 在前一篇博文Hibernate环境搭建中为大家详细的介绍如何搭建一个学习新类库的学习环境.今天,为大家带来一个Hibernate小例子,让大家能够快速上手. 步骤如下: 1.配置hibern ...

  8. spring-mvc-两个个小例子

    1.用Eclipse创建一个工程,命名为spring2.0 并添加相应的jar包(我用的是4.0.5的版本)到 lib 包下: spring-webmvc-4.0.5.RELEASE.jar spri ...

  9. 这42个Python小例子,太走心

    告别枯燥,60秒学会一个Python小例子.奔着此出发点,我在过去1个月,将平时经常使用的代码段换为小例子,分享出来后受到大家的喜欢. 一.基本操作 1 链式比较 i = 3print(1 <  ...

随机推荐

  1. 02 Hibernate错题分析

    解析:使用final修饰的成员变量是常量 解析:不存在StateMoreSession的对象 解析:一个PreparedStatement 可以执行多次executQuery方法 解析:A   使用H ...

  2. java 28 - 3 设计模式之 装饰设计模式

    装饰设计模式 装饰设计模式概述 装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类.是继承的替代方案 优点 使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添 ...

  3. Android使用Java Mail API发送邮件

    最近在考虑为已经有的一个应用程序增加一个用户反馈的功能,用户可以通过反馈功能将用户的意见和建议.程序出现的问题以一种更符合用户习惯的方式反馈回来.网上也有一些实现好的反馈程序的服务,包括bug的提交. ...

  4. iOS多线程之NSOperation详解

    使用NSOperation和NSOperationQueue进行多线程开发,只要将一个NSOperation(实际开发中需要使用其子类 NSInvocationOperation,NSBlockOpe ...

  5. nginx访问白名单设置以及根据$remote_addr分发

    在日常运维工作中,会碰到这样的需求:设置nginx的某个域名访问只对某些ip开放,其他ip的客户端都不能访问.达到这样的目的一般有下面两种设置方法:(1)针对nginx域名配置所启用的端口(一般是80 ...

  6. 深入理解Java之线程池

    原作者:海子 出处:http://www.cnblogs.com/dolphin0520/ 本文归作者海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  7. python环境下载地址

    python: https://www.python.org/downloads/ mysqlyog: http://down.liangchan.net/Webyog%20SQLyog%20Ulti ...

  8. Hadoop: MapReduce2多个job串行处理

    复杂的MapReduce处理中,往往需要将复杂的处理过程,分解成多个简单的Job来执行,第1个Job的输出做为第2个Job的输入,相互之间有一定依赖关系.以上一篇中的求平均数为例,可以分解成三个步骤: ...

  9. oracle: job使用

    oracle的job,实际上就是数据库内置的定时任务,类似代码中的Timer功能.下面是使用过程: 这里我们模拟一个场景:定时调用存储过程P_TEST_JOB 向表TEST_JOB_LOG中插入数据 ...

  10. 用c#操作Mongodb(附demo)

    因为需要,写了一个基于泛型的helper,这样要使用起来方便一点. 为了大家也不重复造轮子,所以发出来希望能帮到谁. 复杂的查询最好用linq,这也是mongodb官方建议的. mongodb的C#配 ...