找以前看看简单的demo,看看node是怎么操作Mongo然后又是渲染前台的,与前面的项目一中的对比。

1.操作Mongo数据库的方法和方式。

var mongodb = require('./db'),
markdown = require('markdown').markdown; function Post(name, head, title, tags, post) {
this.name = name;
this.head = head;
this.title = title;
this.tags = tags;
this.post = post;
} module.exports = Post; //存储一篇文章及其相关信息
Post.prototype.save = function(callback) {
var date = new Date();
//存储各种时间格式,方便以后扩展
var time = {
date: date,
year : date.getFullYear(),
month : date.getFullYear() + "-" + (date.getMonth() + ),
day : date.getFullYear() + "-" + (date.getMonth() + ) + "-" + date.getDate(),
minute : date.getFullYear() + "-" + (date.getMonth() + ) + "-" + date.getDate() + " " +
date.getHours() + ":" + (date.getMinutes() < ? '' + date.getMinutes() : date.getMinutes())
}
//要存入数据库的文档
var post = {
name: this.name,
head: this.head,
time: time,
title:this.title,
tags: this.tags,
post: this.post,
comments: [],
reprint_info: {},
pv:
};
//打开数据库
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
//读取 posts 集合
db.collection('posts', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
//将文档插入 posts 集合
collection.insert(post, {
safe: true
}, function (err) {
mongodb.close();
if (err) {
return callback(err);//失败!返回 err
}
callback(null);//返回 err 为 null
});
});
});
}; //一次获取十篇文章
Post.getTen = function(name, page, callback) {
//打开数据库
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
//读取 posts 集合
db.collection('posts', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
var query = {};
if (name) {
query.name = name;
}
//使用 count 返回特定查询的文档数 total
collection.count(query, function (err, total) {
//根据 query 对象查询,并跳过前 (page-1)*10 个结果,返回之后的 10 个结果
collection.find(query, {
skip: (page - )*,
limit:
}).sort({
time: -
}).toArray(function (err, docs) {
mongodb.close();
if (err) {
return callback(err);
}
//解析 markdown 为 html
docs.forEach(function (doc) {
doc.post = markdown.toHTML(doc.post);
});
callback(null, docs, total);
});
});
});
});
}; //获取一篇文章
Post.getOne = function(name, day, title, callback) {
//打开数据库
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
//读取 posts 集合
db.collection('posts', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
//根据用户名、发表日期及文章名进行查询
collection.findOne({
"name": name,
"time.day": day,
"title": title
}, function (err, doc) {
if (err) {
mongodb.close();
return callback(err);
}
if (doc) {
//每访问 1 次,pv 值增加 1
collection.update({
"name": name,
"time.day": day,
"title": title
}, {
$inc: {"pv": }
}, function (err) {
mongodb.close();
if (err) {
return callback(err);
}
});
//解析 markdown 为 html
doc.post = markdown.toHTML(doc.post);
doc.comments.forEach(function (comment) {
comment.content = markdown.toHTML(comment.content);
});
callback(null, doc);//返回查询的一篇文章
}
});
});
});
}; //返回原始发表的内容(markdown 格式)
Post.edit = function(name, day, title, callback) {
//打开数据库
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
//读取 posts 集合
db.collection('posts', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
//根据用户名、发表日期及文章名进行查询
collection.findOne({
"name": name,
"time.day": day,
"title": title
}, function (err, doc) {
mongodb.close();
if (err) {
return callback(err);
}
callback(null, doc);//返回查询的一篇文章(markdown 格式)
});
});
});
}; //更新一篇文章及其相关信息
Post.update = function(name, day, title, post, callback) {
//打开数据库
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
//读取 posts 集合
db.collection('posts', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
//更新文章内容
collection.update({
"name": name,
"time.day": day,
"title": title
}, {
$set: {post: post}
}, function (err) {
mongodb.close();
if (err) {
return callback(err);
}
callback(null);
});
});
});
}; //删除一篇文章
Post.remove = function(name, day, title, callback) {
//打开数据库
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
//读取 posts 集合
db.collection('posts', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
//查询要删除的文档
collection.findOne({
"name": name,
"time.day": day,
"title": title
}, function (err, doc) {
if (err) {
mongodb.close();
return callback(err);
}
//如果有 reprint_from,即该文章是转载来的,先保存下来 reprint_from
var reprint_from = "";
if (doc.reprint_info.reprint_from) {
reprint_from = doc.reprint_info.reprint_from;
}
if (reprint_from != "") {
//更新原文章所在文档的 reprint_to
collection.update({
"name": reprint_from.name,
"time.day": reprint_from.day,
"title": reprint_from.title
}, {
$pull: {
"reprint_info.reprint_to": {
"name": name,
"day": day,
"title": title
}}
}, function (err) {
if (err) {
mongodb.close();
return callback(err);
}
});
} //删除转载来的文章所在的文档
collection.remove({
"name": name,
"time.day": day,
"title": title
}, {
w:
}, function (err) {
mongodb.close();
if (err) {
return callback(err);
}
callback(null);
});
});
});
});
}; //返回所有文章存档信息
Post.getArchive = function(callback) {
//打开数据库
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
//读取 posts 集合
db.collection('posts', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
//返回只包含 name、time、title 属性的文档组成的存档数组
collection.find({}, {
"name": ,
"time": ,
"title":
}).sort({
time: -
}).toArray(function (err, docs) {
mongodb.close();
if (err) {
return callback(err);
}
callback(null, docs);
});
});
});
}; //返回所有标签
Post.getTags = function(callback) {
//打开数据库
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
//读取 posts 集合
db.collection('posts', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
//distinct 用来找出给定键的所有不同值
collection.distinct("tags", function (err, docs) {
mongodb.close();
if (err) {
return callback(err);
}
callback(null, docs);
});
});
});
}; //返回含有特定标签的所有文章
Post.getTag = function(tag, callback) {
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
db.collection('posts', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
//查询所有 tags 数组内包含 tag 的文档
//并返回只含有 name、time、title 组成的数组
collection.find({
"tags": tag
}, {
"name": ,
"time": ,
"title":
}).sort({
time: -
}).toArray(function (err, docs) {
mongodb.close();
if (err) {
return callback(err);
}
callback(null, docs);
});
});
});
}; //返回通过标题关键字查询的所有文章信息
Post.search = function(keyword, callback) {
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
db.collection('posts', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
var pattern = new RegExp(keyword, "i");
collection.find({
"title": pattern
}, {
"name": ,
"time": ,
"title":
}).sort({
time: -
}).toArray(function (err, docs) {
mongodb.close();
if (err) {
return callback(err);
}
callback(null, docs);
});
});
});
}; //转载一篇文章
Post.reprint = function(reprint_from, reprint_to, callback) {
mongodb.open(function (err, db) {
if (err) {
return callback(err);
}
db.collection('posts', function (err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
//找到被转载的文章的原文档
collection.findOne({
"name": reprint_from.name,
"time.day": reprint_from.day,
"title": reprint_from.title
}, function (err, doc) {
if (err) {
mongodb.close();
return callback(err);
} var date = new Date();
var time = {
date: date,
year : date.getFullYear(),
month : date.getFullYear() + "-" + (date.getMonth() + ),
day : date.getFullYear() + "-" + (date.getMonth() + ) + "-" + date.getDate(),
minute : date.getFullYear() + "-" + (date.getMonth() + ) + "-" + date.getDate() + " " +
date.getHours() + ":" + (date.getMinutes() < ? '' + date.getMinutes() : date.getMinutes())
} delete doc._id;//注意要删掉原来的 _id doc.name = reprint_to.name;
doc.head = reprint_to.head;
doc.time = time;
doc.title = (doc.title.search(/[转载]/) > -) ? doc.title : "[转载]" + doc.title;
doc.comments = [];
doc.reprint_info = {"reprint_from": reprint_from};
doc.pv = ; //更新被转载的原文档的 reprint_info 内的 reprint_to
collection.update({
"name": reprint_from.name,
"time.day": reprint_from.day,
"title": reprint_from.title
}, {
$push: {
"reprint_info.reprint_to": {
"name": doc.name,
"day": time.day,
"title": doc.title
}}
}, function (err) {
if (err) {
mongodb.close();
return callback(err);
}
}); //将转载生成的副本修改后存入数据库,并返回存储后的文档
collection.insert(doc, {
safe: true
}, function (err, post) {
mongodb.close();
if (err) {
return callback(err);
}
callback(err, post[]);
});
});
});
});
};

2.操作Mysql的方式;

'use strict';

var pool = require('./pool');
var Util = require('../utils/util'); function User(data) {
this.userId = data.userId; //用户id
this.userLogin = data.userLogin; //用户名
this.userPass = data.userPass; //密码
this.userSalt = data.userSalt; //加密时使用的盐
this.userNicename = data.userNicename; //名字,通常为中文名
this.userEmail = data.userEmail; //邮箱
this.userRegistered = data.userRegistered || new Date(); //注册日期
this.userStatus = data.userStatus; //用户状态
this.privilege = data.privilege; //权限
} User.ITERATIONS = ; User.KEY_LEN = ; User.PWD_LENGTH = ; /**
* 根据id来查找用户
* @static method findById
* @for User
* @param {Number} id 用户id
* @param {Function} callback 回调函数,第一个参数是错误对象或null,第二个参数是User对象
*/
User.findById = function(id, callback) {
if (!Util.isInt(id)) {
return callback(new Error('id is not an integer'));
}
pool.getConnection(function(err, conn) {
if (err) {
return callback(err);
}
var sql = 'SELECT * FROM cp_user WHERE user_id = ?';
conn.query(sql, [id], function(err, rows, fields) {
conn.release();
var user;
if (!err && rows.length) {
var userData = {};
userData.userId = rows[].user_id;
userData.userLogin = rows[].user_login;
userData.userPass = rows[].user_pass;
userData.userSalt = rows[].user_salt;
userData.userNicename = rows[].user_nicename;
userData.userEmail = rows[].user_email;
userData.userRegistered = rows[].user_registered;
userData.userStatus = rows[].user_status;
user = new User(userData);
}
callback(err, user);
});
});
}; /**
* 根据email来查找用户
* @static method findByEmail
* @for User
* @param {String} email 邮箱
* @param {Function} callback 回调函数,第一个参数是错误对象或null,第二个参数是User对象
*/
User.findByEmail = function(email, callback) {
if (!Util.isString(email)) {
return callback(new Error('email is not a string type'));
}
pool.getConnection(function(err, conn) {
if (err) {
callback(err);
} else {
var sql = 'SELECT * FROM cp_user WHERE user_email = ?';
conn.query(sql, [email], function(err, rows, fields) {
conn.release();
var user;
if (!err && rows.length) {
var userData = {};
userData.userId = rows[].user_id;
userData.userLogin = rows[].user_login;
userData.userPass = rows[].user_pass;
userData.userSalt = rows[].user_salt;
userData.userNicename = rows[].user_nicename;
userData.userEmail = rows[].user_email;
userData.userRegistered = rows[].user_registered;
userData.userStatus = rows[].user_status;
user = new User(userData);
}
callback(err, user);
});
}
});
}; /**
* 查找指定数目的用户,若没有start,count这两个参数,表示要查找所有的用户
* @static method findUsers
* @for User
* @param {Number} start 索引,索引从0开始
* @param {Number} count 要查找的用户数目
* @param {Function} callback 回调函数,第一个参数是错误对象或null,第二个参数是User对象数组
*/
User.findUsers = function(start, count, callback) {
if (!Util.isInt(start)) {
return callback(new Error('start is supposed to be an integer'));
}
if (!Util.isInt(count)) {
return callback(new Error('count is supposed to be an integer'));
}
if (count <= ) {
return callback(new Error('count must be greater than 0'));
}
pool.getConnection(function(err, conn) {
if (err) {
callback(err);
} else {
var sql = 'SELECT * FROM cp_user LIMIT ?, ?';
var arr = [start, count];
conn.query(sql, arr, function(err, rows, fields) {
conn.release();
if (err) {
rows = [];
}
for (var i = ; i < rows.length; i++) {
var userData = {};
userData.userId = rows[i].user_id;
userData.userLogin = rows[i].user_login;
userData.userPass = rows[i].user_pass;
userData.userSalt = rows[i].user_salt;
userData.userNicename = rows[i].user_nicename;
userData.userEmail = rows[i].user_email;
userData.userRegistered = rows[i].user_registered;
userData.userStatus = rows[i].user_status;
rows[i] = new User(userData);
}
callback(err, rows);
});
}
});
}; /**
* 查找所有的用户
* @static method findAll
* @for User
* @param {Function} callback 回调函数,第一个参数是错误对象或null,第二个参数是User对象数组
*/
User.findAll = function(callback) {
pool.getConnection(function(err, conn) {
if (err) {
callback(err);
} else {
var sql = 'SELECT * FROM cp_user';
conn.query(sql, function(err, rows, fields) {
conn.release();
if (err) {
rows = [];
}
for (var i = ; i < rows.length; i++) {
var userData = {};
userData.userId = rows[i].user_id;
userData.userLogin = rows[i].user_login;
userData.userPass = rows[i].user_pass;
userData.userSalt = rows[i].user_salt;
userData.userNicename = rows[i].user_nicename;
userData.userEmail = rows[i].user_email;
userData.userRegistered = rows[i].user_registered;
userData.userStatus = rows[i].user_status;
rows[i] = new User(userData);
}
callback(err, rows);
});
}
});
}; /**
* 根据email来修改用户的密码
* @static method updatePwdByEmail
* @for User
* @param {String} email 邮箱
* @param {String} passwd 密码
* @param {Function} callback 回调函数,参数是错误对象或null
*/
User.updatePwdByEmail = function(email, passwd, callback) {
if (!Util.isString(email)) {
return callback(new Error('email is not a string type'));
}
if (!Util.isString(passwd)) {
return callback(new Error('passwd is not a string type'));
}
if (passwd.length !== User.PWD_LENGTH) {
return callback(new Error('passwd.length != User.PWD_LENGTH'));
}
pool.getConnection(function(err, conn) {
if (err) {
callback(err);
} else {
var sql = 'UPDATE cp_user SET user_pass = ? WHERE user_email = ?';
conn.query(sql, [passwd, email], function(err) {
conn.release();
callback(err);
});
}
});
}; /**
* 根据id来修改用户的密码
* @static method updatePwdById
* @for User
* @param {Number} id 用户id
* @param {String} passwd 密码
* @param {Function} callback 回调函数,参数是错误对象或null
*/
User.updatePwdById = function(id, passwd, callback) {
if (!Util.isInt(id)) {
return callback(new Error('id is not an integer'));
}
if (!Util.isString(passwd)) {
return callback(new Error('passwd is not a string type'));
}
if (passwd.length !== User.PWD_LENGTH) {
return callback(new Error('passwd.length != User.PWD_LENGTH'));
}
pool.getConnection(function(err, conn) {
if(err) {
callback(err);
}else {
var sql = 'UPDATE cp_user SET user_pass = ? WHERE user_id = ?';
conn.query(sql, [passwd, id], function(err, result) {
conn.release();
callback(err);
});
}
});
}; /**
* 新增一个用户
* @method save
* @for User
* @param {Function} callback 回调函数,第一个参数是错误对象或null,第二个参数是User对象
*/
User.prototype.save = function(callback) {
var self = this;
pool.getConnection(function(err, conn) {
if(err) {
return callback(err);
}
var sql = 'INSERT INTO cp_user (user_login, user_salt, user_pass, user_nicename, user_email, user_registered, user_status) VALUES (?,?,?,?,?,?,?)';
var arr = [ self.userLogin, self.userSalt, self.userPass, self.userNicename,
self.userEmail, self.userRegistered, self.userStatus];
conn.query(sql, arr, function(err, result) {
conn.release();
if(!err) {
self.userId = result.insertId;
}
callback(err, self);
});
});
}; /**
* 有些属性不能暴露给客户端,返回一个只有部分属性的User对象
* @method toUser
* @for User
* @return {User} 返回一个User对象
*/
User.prototype.toUser = function() {
var user = new User(this);
delete user.userPass;
delete user.userSalt;
return user;
};

node的实践(项目二)的更多相关文章

  1. python实践项目二:列表转字符串

    将列表各元素转换为字符串并以规定形式返回. 假定有下面这样的列表:spam = ['apples', 'bananas', 'tofu', 'cats'],将其转换成字符串:'apples, bana ...

  2. 20155320 2016-2017-2《Java程序设计》第十二周课堂实践项目

    20155320 2016-2017-2<Java程序设计>第十二周课堂实践项目 1.修改教材P98 Score2.java, 让执行结果数组填充是自己的学号: 2.在IDEA中以TDD的 ...

  3. Cookie和Session在Node.JS中的实践(二)

    Cookie和Session在Node.JS中的实践(二) cookie篇在作者的上一篇文章Cookie和Session在Node.JS中的实践(一)已经是写得算是比较详细了,有兴趣可以翻看,这篇是s ...

  4. React 实践项目 (二)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...

  5. [独孤九剑]持续集成实践(二)– MSBuild语法入门

    本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...

  6. Xamarin.Android开发实践(二)

    原文:Xamarin.Android开发实践(二) 一.准备 开始学习本教程前必须先完成该教程http://www.cnblogs.com/yaozhenfa/p/xamarin_android_qu ...

  7. python编程快速上手之第10章实践项目参考答案

      本章主要讲了python程序的调试,当程序有BUG或异常的时候,我们如何调试代码找出问题点.其实在本章之前的章节我们做练习的时候都会遇到各种各样的错语和异常,最初当不知道程序哪里出错的情况下不可否 ...

  8. python编程快速上手之第9章实践项目参考答案

    本章介介绍了shutil,zipfile模块的使用,我们先来认识一下这2个模块吧. 一.shutil模块 shutil模块主要用于对文件或文件夹进行处理,包括:复制,移动,改名和删除文件,在shuti ...

  9. React 实践项目 (三)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! 上回说到使用Redux进行 ...

  10. React 实践项目 (五)

    React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...

随机推荐

  1. ELK 信息统计分析-2

    Range 按数值类型的字段聚合统计 { "query": { "match_all": {} }, "aggs": { "ter ...

  2. CSS中的 backgroundPosition 属性

    body { background-image:url('bgimage.gif'); background-repeat:no-repeat; background-attachment:fixed ...

  3. linux 程序管理

    在linux下做开发,经常要用到一些管理程序的命令,如查看进程,查看内存等情况.看网络情况.如下的笔记是看书时记下一些简单常用的命令. 1)top [root@005 fsh]#top[-d数字]|t ...

  4. Android中的Shape使用总结

    参考:http://www.cnblogs.com/gzggyy/archive/2013/05/17/3083218.html 在Android程序开发中,我们经常会去用到Shape这个东西去定义各 ...

  5. [转]用NPOI操作EXCEL--数据有效性

    本文转自:http://www.cnblogs.com/atao/archive/2009/09/22/1572170.html 在有些情况下(比如Excel引入),我们可能不允许用户在Excel随意 ...

  6. ZooKeeper系列1:ZooKeeper的配置

    问题导读:1.zookeeper有哪些配置文件?2.zookeeper最低配置需要哪些配置项?3.zookeeper高级配置需要配置哪些项? ZooKeeper 的功能特性通过 ZooKeeper 配 ...

  7. Linux下的C之2048

    #include <stdio.h> #include <stdlib.h> #include <curses.h> #include <time.h> ...

  8. 【读书笔记《Android游戏编程之从零开始》】14.游戏开发基础(Bitmap 位图的渲染与操作)

    Bitmap 是图形类,Android 系统支持的图片格式有 png.jpg.bmp 等. 对位图操作在游戏中是很重要的知识点,比如游戏中需要两张除了大小之外其他完全相同的图,那么如果会对位图进行缩放 ...

  9. Hanoi塔

    2016-03-19 17:01:35 问题描述: 假设有三个命名为 A B C 的塔座 ,在塔座A上插有n个直径大小不相同,由小到大编号为1 ,2 ,3 ,··· ,n的圆盘,要求将A座上的圆盘移至 ...

  10. MATLAB基本命令

    eye(n)创建n阶单位矩阵 zeros(n)创建n阶0方阵 rand(m,n)创建m*n阶元素为从0到1的均匀分布的随机数矩阵 round(A)对矩阵A中所有元素进行四舍五入运算 A^-1用幂运算求 ...