又是一个简单的小玩意儿, 不过有个大玩意儿,就是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. ​【Python基础】告别枯燥,60 秒学会一个 Python 小例子(文末下载)

    本文推荐一个python的傻瓜式的学习资源,内容简单易懂,让人可以在60 秒学会一个 Python 小例子 当前库已有 300多 个实用的小例子 本文来源:https://github.com/jac ...

  2. [vue] 使用vue开发一个todo小应用,谈下你的思路

    [vue] 使用vue开发一个todo小应用,谈下你的思路 结构: 输入部分( input )和输出部分( ul ) 逻辑:用户输入之后,通过事件触发拿到用户输入的数据存起来, 将用户数据集合通过 v ...

  3. 在Eclipse中写第一个hibernate小例子

    在hibernate自带的文档中,包含了一个很简单的小例子,不过这个小例子是基于ant的,而且说的不是很详细,不利于新手学习.在这里,我将在Eclipse中实现这个例子,并给出详细的实现步骤.     ...

  4. 告别刷抖音!30秒一个Python小例子,总有一款适合你

    小编每天上班坐地铁,不是刷抖音就是煲电视剧,不是我不想学习,主要是短视频太好看了,30秒一个,刷刷刷的不停啊.如果Python也有30秒学习的小例子,我也一定会看呢. 于是小编收录整理了一些30秒一个 ...

  5. 告别刷抖音!30秒一个Python小例子,总有一款适合你,赶紧收藏!

    小编每天上班坐地铁,不是刷抖音就是煲电视剧,不是我不想学习,主要是短视频太好看了,30秒一个,刷刷刷的不停啊.如果Python也有30秒学习的小例子,我也一定会看呢. 于是小编收录整理了一些30秒一个 ...

  6. python抖音粉丝_告别刷抖音!30秒一个Python小例子,总有一款适合你

    小编每天上班坐地铁,不是刷抖音就是煲电视剧,不是我不想学习,主要是短视频太好看了,30秒一个,刷刷刷的不停啊.如果Python也有30秒学习的小例子,我也一定会看呢. 于是小编收录整理了一些30秒一个 ...

  7. python刷抖音浏览_告别刷抖音!30秒一个Python小例子,总有一款适合你

    小编每天上班坐地铁,不是刷抖音就是煲电视剧,不是我不想学习,主要是短视频太好看了,30秒一个,刷刷刷的不停啊.如果Python也有30秒学习的小例子,我也一定会看呢. 于是小编收录整理了一些30秒一个 ...

  8. ExpandableListView用法的一个简单小例子

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

  9. 矩阵的卷积核运算(一个简单小例子的讲解)深度学习

    卷积运算:假设有一个卷积核h,就一般为3*3的矩阵: 有一个待处理矩阵A: h*A的计算过程分为三步 第一步,将卷积核翻转180°,也就是成为了 第二步,将卷积核h的中心对准x的第一个元素,然后对应元 ...

  10. linux 进入rescue模式,一个简单小例子来说一下Rescue营救模式

    昨天不小心将/lib64下的一个动态库文件libc.so.6(很多命令都依赖的)给移动到了/root下,然后除了一些内部命令可用外,其余命令都不能用了,然后就想着看看重启可不可以修复,结果重启后就再也 ...

最新文章

  1. 决策树--信息增益,信息增益比,Geni指数的理解
  2. Microsoft宣称Visual Studio Installer将退役
  3. storm能不能测试wadl_情感测试:4朵玫瑰花,哪个会最扎手?测你婚后能不能享住TA?...
  4. 同事都说有SQL注入风险,我非说没有
  5. python根据列表绘制柱状图_python把一个列表画柱状图
  6. Linux学习笔记十三——文件压缩、解压缩和归档
  7. VS2008安装后无法安装office2007的解决办法
  8. 用GridView实现SPListItemCollection翻页
  9. OAuth 及 移动端鉴权调研
  10. 11.深入分布式缓存:从原理到实践 --- Aerospike原理及广告业务应用
  11. 转速测试软件app,实时显示行车速度app手机版-手机实时行车速度显示app(gps车速表)v1.6最新版_新绿资源网...
  12. 安全漏洞之host头攻击漏洞
  13. 怎么在运行上面看域名服务器,域名dns服务器查询方法是什么?如何查看dns服务器地址...
  14. Android简易实战教程--第三十七话《NotifiCation》
  15. matlab绘制s域零极点分布图,《信号与系统》第五章 连续系统的s域分析.ppt
  16. modelsim10.7遇到LM_LICENSE_FILE问题,成功解决运行OK
  17. vue使用Export2Excel.js导出表格自定义样式(表头加分割斜线)(笔记)
  18. h3c查看光纤光功率
  19. handler中的handler.removecallbacks和handler.removemessages的用法
  20. vue+element-ui金额大小写转换

热门文章

  1. Linux系统攻略关于vi替换命令的使用说明
  2. 【Vegas原创】控制文件损坏,使用trace文件恢复DB
  3. html5用户输入后自动显示用户名已重复_lt;inputgt; | HTML输入框标签
  4. activity 变成后台进程后被杀死_Android开发后台服务
  5. 魔域私服怎么老服务器中断,魔域私服技术文章-服务器端比较正确的数据库解释文件...
  6. 绘制Linux/Android设备的内存动态变化趋势图
  7. Uboot系统初始化为何要初始化堆栈?为何C语言的函数调用要用到堆栈,而汇编却不需要初始化堆栈?
  8. 浅析Linux下的task_struct结构体
  9. tensorflow stack unstack操作
  10. 使用匿名内部类排序对象