上一篇 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;