前言:
话说这个玩意真的不好折腾,特别是在自己js水平几乎为0的情况下,异步编程真的很纠结,特别是那无穷无尽的括号,根本找不到错误的理由,好了,不抱怨了,自己水平菜不能怪社会。今天来看看Node连接mongodb的一个实例雷叔《Node.js实战》上面的。
开始折腾:
1.添加 package.json中的依赖包如下:
- "express-session": "1.12.1", //express所需session组件
- "connect-mongo":"0.8.2", //用来将connect的session持久化到mongodb中的
- "mongoose":"4.3.0", //ORM对象映射关系框架
- "connect-flash":"0.1.1", //用来显示一次性的提醒(刷新后失效)
- "mongodb":"2.0.52"//真正的active mongodb驱动
2.建立user modules的创建:
- var mongodb = require('./db');
- function User(user) {
- this.name = user.name;
- this.password = user.password;
- this.email = user.email;
- };
- module.exports = User;
- //储存用户信息
- User.prototype.save = function(callback) {
- //要存入数据库的文档
- var user = {
- name: this.name,
- password: this.password,
- email: this.email
- };
- //打开数据库
- mongodb.open(function(err, db) {
- if (err) {
- return callback(err); //错误返回err信息
- }
- db.collection('users', function(err, collection) {
- if (err) {
- mongodb.close();
- return callback(err);
- }
- //将用户数据插入到users集合
- collection.insert(user, {
- safe: true
- }, function(err, user) {
- mongodb.close();
- if (err) {
- return callback(err); //错误返回err信息
- }
- callback(null, user[0]); //成功err为null,并返回储存后的用户文档
- });
- });
- });
- };
- //读取用户信息
- User.get = function(name, callback) {
- mongodb.open(function(err, db) {
- if (err) {
- return callback(err);
- }
- //读取user集合
- db.collection('users', function(err, collection) {
- if (err) {
- mongodb.close();
- return callback();
- }
- //查找用户名name建值为name的一个文档
- collection.findOne({
- name: name
- }, function(err, user) {
- mongodb.close();
- if (err) {
- return callback(err);
- }
- callback(null, user); //返回用户的信息
- });
- });
- });
- }
3.对route进行修改 reg.html为注册页面(对路由规则完善):
- var crypto = require('crypto');//引入加密模块
- var User = require('../modules/user.js');
- module.exports = function(app) { //路由模板样式可以在原路由routes中查看
- app.get('/', function(req, res, next) {
- res.render('index', {
- title: '主页'
- });
- });
- app.get('/login', function(req, res, next) {
- res.render('login', {
- title: '登陆'
- });
- });
- app.get('/err', function(req, res, next) {
- res.render('err', {
- title: '错误'
- });
- });
- app.get('/reg', function(req, res, next) {
- res.render('reg', {
- title: '注册'
- });
- });
- app.post('/reg', function(req, res, next) {
- var name = req.body.name,
- password = req.body.password,
- password_re = req.body['password-repeat'];
- //检测两次用户输入的是否一致
- if (password_re != password) {
- req.flash('err', '两次输入的密码不一致!');
- return res.redirect('/reg'); //返回注册页
- }
- //生成密码的md5值
- var md5 = crypto.createHash('md5'),
- password = md5.update(req.body.password).digest('hex');
- var newUser = new User({
- name: req.body.name,
- password: password,
- email: req.body.email
- });
- //检查用户名是否已经存在
- User.get(newUser.name, function(err, user) {
- if (err) {
- req.flash('error', err);
- return res.redirect('/');
- }
- if (user) {
- req.flash('error', '用户已存在!');
- return res.redirect('/reg');
- }
- //如果不存在则新增用户
- newUser.save(function(err, user) {
- if (err) {
- req.flash('error', err);
- return res.redirect;
- }
- req.session.user = user;
- req.flash('sucess', '注册成功!');
- res.redirect('/'); //注册后返回主页
- });
- });
- });
- }
4.在 app.js 的var settings = require(‘./views/setting’); 下添加var flash =require(‘connect-flash’); 用来返回刷新页面。
测试:
首先运行mongdb,然后npm start 启动项目,访问localhost:3000/reg ,输入账号,两次密码,还有邮箱,点击注册。然后我们看数据库当前信息刷新。
我们打开 mongo.exe use test //使用test库 ,使用db.users.find() 命令查询users集合里的第一个数据。返回如下,我们可以看到,注册的信息已经输入到了数据库,而且password已经通过crypto进行了MD5加密。
后记:
照葫芦画瓢,那样就没得意思了,继续去恶补知识了,话说我的Noder Q群——193572405 已经来了大概50人了,这玩意很难学,特别是对js前端的东东没有接触过的,我希望折腾node.js的菜鸟大神们有空来群里逛逛,我分享了很多资料。