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

时间:2022-03-20 04:51:52

上一篇 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文件,目录如下:
nodejs+mongodb系列教程之(4/5)--mongoose使用
 

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


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

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

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



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;

测试结果


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



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