node的实践(项目二)
找以前看看简单的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的实践(项目二)的更多相关文章
- python实践项目二:列表转字符串
		将列表各元素转换为字符串并以规定形式返回. 假定有下面这样的列表:spam = ['apples', 'bananas', 'tofu', 'cats'],将其转换成字符串:'apples, bana ... 
- 20155320 2016-2017-2《Java程序设计》第十二周课堂实践项目
		20155320 2016-2017-2<Java程序设计>第十二周课堂实践项目 1.修改教材P98 Score2.java, 让执行结果数组填充是自己的学号: 2.在IDEA中以TDD的 ... 
- Cookie和Session在Node.JS中的实践(二)
		Cookie和Session在Node.JS中的实践(二) cookie篇在作者的上一篇文章Cookie和Session在Node.JS中的实践(一)已经是写得算是比较详细了,有兴趣可以翻看,这篇是s ... 
- React 实践项目 (二)
		React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ... 
- [独孤九剑]持续集成实践(二)– MSBuild语法入门
		本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ... 
- Xamarin.Android开发实践(二)
		原文:Xamarin.Android开发实践(二) 一.准备 开始学习本教程前必须先完成该教程http://www.cnblogs.com/yaozhenfa/p/xamarin_android_qu ... 
- python编程快速上手之第10章实践项目参考答案
		本章主要讲了python程序的调试,当程序有BUG或异常的时候,我们如何调试代码找出问题点.其实在本章之前的章节我们做练习的时候都会遇到各种各样的错语和异常,最初当不知道程序哪里出错的情况下不可否 ... 
- python编程快速上手之第9章实践项目参考答案
		本章介介绍了shutil,zipfile模块的使用,我们先来认识一下这2个模块吧. 一.shutil模块 shutil模块主要用于对文件或文件夹进行处理,包括:复制,移动,改名和删除文件,在shuti ... 
- React 实践项目 (三)
		React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! 上回说到使用Redux进行 ... 
- React 实践项目 (五)
		React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ... 
随机推荐
- 烂泥:centos安装LVM方式
			本文由秀依林枫提供友情赞助,首发于烂泥行天下. 最近开始打算学习有关LVM逻辑卷的知识,由于以前没有接触过,看了很多有关这方面的视频.但是一直不深入.今天就先不管了,先把centos系统安装在LVM上 ... 
- 01_蚂蚁感冒(第五届蓝桥预赛本科B组第8题 nyoj 990)
			问题来源:第五届蓝桥预赛本科B组第8题 问题描述:有在一条定长(100cm)的直杆上有n(1<n<50)只蚂蚁(每只蚂蚁的起点都不一样),他们都以相同的速度(1cm/s)向左或者向右爬, ... 
- ArcGis 10+Oracle发布WFS-T服务,无法更新Feature的解决方法
			现象: 前端采用Openlayers,更新Feature时服务器端返回的XML提示更新错误 原因: 参考:http://support.esri.com/en/knowledgebase/techar ... 
- 技巧:利用 Workflow 显示附近的免费 Wi-Fi
			得益于 Workflow 自 1.5.3 版本起更新的 Get Content of URL 动作,该 App 的潜力得到了极大的提升.本文分享一种有趣的用法,搜寻附近的免费 Wi-Fi 并择一显示在 ... 
- c++ static变量
			C++中Static作用和使用方法 1.什么是static? static是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 2.为什么要引入static? 函数内部定义的变量, ... 
- codeforces 711A A. Bus to Udayland(水题)
			题目链接: A. Bus to Udayland 题意: 找一对空位坐下来,水; 思路: AC代码: #include <iostream> #include <cstdio> ... 
- Centos源码安装Python3
			CentOS7默认安装了python2.7.5,当需要使用python3的时候,可以手动下载Python源码后编译安装. 下载python(https://www.python.org/ftp/pyt ... 
- HDU 4998 Rotate --几何
			题意:给n个点(x,y,p),从1~n,一次每次所有点绕着第 i 个点(原来的)逆时针转pi个弧度,问最后所有点的位置相当于绕哪个点旋转多少弧度,求出那点X和弧度P 解法:直接模拟旋转,每次计算新的坐 ... 
- 保存带有emoji的文本报错解决方案
			今天偶然遇到一个错误,就是保存文本的时候带有了emoji表情,报错了 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x8A\ ... 
- Android SQLite (三 ) 全面详解(一)
			官网 SQLite是一款轻型的数据库,是关系型数据库(RDBMS)管理系统,它包含在一个相对小的C库中.目前在很多嵌入式产品中使用了它,它占用资源非常 的低,在嵌入式设备中,可能只需要几百K的内存就够 ... 
