找以前看看简单的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. jQuery Form 表单提交插件-----ajaxSubmit() 的应用

    Form Plugin API 里提供了很多有用的方法可以让你轻松的处理表单里的数据和表单的提交过程. 测试环境:部署到Tomcat中的web项目. 一.ajaxSubmit() 介绍  立即通过AJ ...

  2. Ajax详解及其案例分析------如何获得Ajax对象,使用Ajax对象发送GET和POST请求,校验用户名,POST和GET请求时的乱码处理,实现级联的下拉列表

    本节主要内容预览: 1 获得Ajax对象 2 使用Ajax对象发送GET请求 3 使用Ajax对象发送POST请求 4 使用Ajax校验用户名 5 POST请求时的乱码处理 6 GET请求时的乱码处理 ...

  3. [分享]一个String工具类,也许你的项目中会用得到

    每次做项目都会遇到字符串的处理,每次都会去写一个StringUtil,完成一些功能. 但其实每次要的功能都差不多: 1.判断类(包括NULL和空串.是否是空白字符串等) 2.默认值 3.去空白(tri ...

  4. linux文件压缩与打包

    在linux中常见的压缩命令 首先,在linux中压缩文件的扩展名大多是 *.gz gzip程序压缩的文件 *.bz2 bzip2程序压缩的文件 *.tar tar程序打包的数据,并没有压缩过 *.t ...

  5. [转载] Android Metro风格的Launcher开发系列第一篇

    前言:从毕业到现在已经三年多了,回忆一下这三年基本上没有写过博客,总是觉得忙,没时间写,也觉得写博客没什么大用.但是看到很多大牛们都在写博客,分享自己的东西,所以嘛本着向大牛看齐,分享第一,记录第二的 ...

  6. 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解

    本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...

  7. 探索 OpenStack 之(13):研究 Keystone

    Keystone 是 OpenStack Identity Service 的项目名称.本文就试着尽可能深入地研究 Keystone. 1. Keystone 的功能 做为 OpenStack 云系统 ...

  8. 【C#】2.算法温故而知新 - 冒泡排序

    冒泡排序可以很好的解决前面提到的简单桶排序的2个问题,冒泡排序的基本思想是:每次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来. 该算法的核心部分是双重嵌套循环,其时间复杂度是O(N²). 缺 ...

  9. 边工作边刷题:70天一遍leetcode: day 87

    Implement strStr() 要点:rolling hash方法的速度比较慢. 小优化:不用hash%base,而用hash-=base*最高位是一样的. rolling hash错误点: b ...

  10. sql 入门经典(第五版) Ryan Stephens 学习笔记  第四部分:建立复杂的数据库查询/

    第十三章: 在查询表里结合表 1.等值结合 : // 选择 tabla_a 和table_b 中id相等的行,输出 他们的id 和name select table_a.id , table_a.na ...