nodejs+mongodb系列教程之(4/5)--mongoose使用

来源:互联网 发布:学校机房软件 编辑:程序博客网 时间:2024/04/25 23:39

上一篇 nodejs+mongodb系列教程之--理解路由和中间件 显得过于理论化。这篇准备准备写一篇实战了~ 主要就是给大家看看我在项目里面怎么使用的,就做一个用户的注册登陆吧.

1.简单介绍mongoose

mongoose 是nodejs中mongoldb驱动,使用的api和使用原生的mongodb脚本几乎一样,同时添加了一些便捷的api方法,可以参考:https://cnodejs.org/topic/504b4924e2b84515770103dd 很不错的一篇文章


2.mongoose的安装

切换到你的项目根目录下执行命令:

npm install mongoose 


3.mongoose实战

如果你还没有安装mongodb请移步mongodb官网、度娘或谷歌根据你的操作系统安装寻找不同的安装方式。
新建一个config文件夹,再新建一个config.js文件,目录如下:

 

config.js中的代码如下:

var mongoose = require('mongoose');//引入mongoose库mongoose.connect('mongodb://localhost:27017/demo');//mongodb连接地址,demo为数据库名称,默认mongodb连接不需要密码exports.mongoose = mongoose;//导出mongoose对象


创建models文件夹,用于存放实体,新建一个实体基础类Base.js

/** * Created by yong_pliang on 15/7/21. */var mongodb = require('../config/config');//引入config中的mongodb对象var mongoose = mongodb.mongoose;//获取mongoosevar Schema = mongoose.Schema;//获取Schema,以便快捷使用var ObjectId = Schema.Types.ObjectId;//获取ObjectId类型,以便快捷使用exports.mongodb = mongodb;//导出mongodbexports.mongoose = mongoose; //导出mongooseexports.Schema = Schema;//导出Schemaexports.ObjectId = ObjectId;//导出ObjectIdexports.Mixed = Schema.Types.Mixed;//导出Mixed


下面我们做个注册和登陆功能,本篇重点是mongoose数据库操作,所以关于路径安全、注册验证码、统一错误处理、token加密这些会放在下一篇演示。

 最终的目录结构如下,么有的请创建,多余的请删除




User.js(User模型)文件的内容如下:

var base = require('./Base');var ObjectId = base.ObjectId;var UserScheme =new base.Schema({    password:String,//密码    mobile:String,//手机    lastLoginTime:Date,//最后登陆时间    createTime:{type:Date,default:Date.now}//创建时间});UserScheme.index({mobile:1},{"background" : true});//设置索引var UserEntity = base.mongoose.model('UserEntity',UserScheme,'user');//指定在数据库中的collection名称为userexports.UserEntity  = UserEntity;//导出实体



user.js(user路由中间件)文件内容如下


/** * Created by yong_pliang on 15/12/18. */var express = require('express');var router = express.Router();var UserEntity = require('../models/User').UserEntity;var RestResult = require('../RestResult');//注册路由router.post('/register',function(req,res,next){    var restResult = new RestResult();    var mobile = req.body.mobile;    if (!/1\d{10}/.test(mobile)){//手机号码格式校验        restResult.errorCode = RestResult.ILLEGAL_ARGUMENT_ERROR_CODE;        restResult.errorReason = "请填写真确的手机格式";        res.send(restResult);        return;    }    var password = req.body.password;    if(!password || password.length < 6){//密码长度校验        restResult.errorCode = RestResult.ILLEGAL_ARGUMENT_ERROR_CODE;        restResult.errorReason = "密码长度不能少于6位";        res.send(restResult);        return;    }    //findOne方法,第一个参数数条件,第二个参数是字段投影,第三那个参数是回调函数    UserEntity.findOne({mobile:mobile},'_id',function(err,user){        if(err){//查询异常            restResult.errorCode = RestResult.SERVER_EXCEPTION_ERROR_CODE;            restResult.errorReason = "服务器异常";            res.send(restResult);            return;        }        if (user){//手机号已注册            restResult.errorCode = RestResult.BUSINESS_ERROR_CODE;            restResult.errorReason = "手机号已注册";            res.send(restResult);            return;        }        var registerUser = new UserEntity({mobile:mobile,password:password});        //调用实体的实例的保存方法        registerUser.save(function(err,row){            if(err){//服务器保存异常                restResult.errorCode = RestResult.SERVER_EXCEPTION_ERROR_CODE;                restResult.errorReason = "服务器异常";                res.send(restResult);                return;            }            res.send(restResult);//返回成功结果        });    });});//登陆路由router.post('/login',function(req,res,next){    var restResult = new RestResult();    var mobile = req.body.mobile;    if (!/1\d{10}/.test(mobile)){//手机号码格式校验        restResult.errorCode = RestResult.ILLEGAL_ARGUMENT_ERROR_CODE;        restResult.errorReason = "请填写真确的手机格式";        res.send(restResult);        return;    }    var password = req.body.password;    if(!password){        restResult.errorCode = RestResult.ILLEGAL_ARGUMENT_ERROR_CODE;        restResult.errorReason = "密码不能为空";        res.send(restResult);        return;    }    UserEntity.findOne({mobile:mobile,password:password},{password:0},function(err,user){        if(err){            restResult.errorCode = RestResult.SERVER_EXCEPTION_ERROR_CODE;            restResult.errorReason = "服务器异常";            res.send(restResult);            return;        }        if(!user){            restResult.errorCode = RestResult.BUSINESS_ERROR_CODE;            restResult.errorReason = "用户名或密码错误";            res.send(restResult);            return;        }        restResult.returnValue = user;        res.send(restResult);        //更新最后登陆时间        UserEntity.update({_id:user._id},{$set: {lastLoginTime: new Date()}}).exec();    });});module.exports = router;


RestResult.js(统一返回数据格式)文件内容如下:

var RestResult = function(){    this.errorCode = RestResult.NO_ERROR ;    this.returnValue = {};    this.errorReason = "";};RestResult.NO_ERROR = 0;//无错误RestResult.ILLEGAL_ARGUMENT_ERROR_CODE = 1;//无效参数错误RestResult.BUSINESS_ERROR_CODE = 2;//业务错误RestResult.AUTH_ERROR_CODE = 3;//认证错误RestResult.SERVER_EXCEPTION_ERROR_CODE = 5;//服务器未知错误RestResult.TARGET_NOT_EXIT_ERROR_CODE = 6;//目标不存在错误module.exports = RestResult;

测试结果





1 0
原创粉丝点击