上一篇 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;//获取mongoose var Schema = mongoose.Schema;//获取Schema,以便快捷使用 var ObjectId = Schema.Types.ObjectId;//获取ObjectId类型,以便快捷使用 exports.mongodb = mongodb;//导出mongodb exports.mongoose = mongoose; //导出mongoose exports.Schema = Schema;//导出Schema exports.ObjectId = ObjectId;//导出ObjectId exports.Mixed = Schema.Types.Mixed;//导出Mixed
最终的目录结构如下,么有的请创建,多余的请删除
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名称为user exports.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;