• 实战:一、使用mongo做一个注册的小demo


    思路:
    1、使用mongoose 进行 数据库的链接
    2、使用Schema来进行传输字段的定义
    3、安装koa-router进行数据处理
    4、安装koa-bodyparser 进行post数据交互
    5、解决跨域
    6、前端传递值
    7、在router.pot里面 处理 前端传递过来的值。

    一、连接数据库
    (1)建立一个项目文件夹: service , npm init
    (2)安装 mongoose连接数据库,Mongoose是一个开源的封装好的实现node和MongoDB数据通讯的数据建模库 ,npm i mongoose -S
    (3)建立一个database的文件夹,来存放和数据库相关的文件,init.js 代码如下:

    const mongoose = require('mongoose');	//引入mongoose插件
    const db = "mongodb://localhost/demo1" 	//建立链接的地址,如果数据库里面没有这个数据表则自动建立
    
    exports.connect = ()=>{	//把connect 这个函数暴露出去,并且在此函数里面做一下操作。
        //连接数据库
        mongoose.connect(db)
        //如果数据库连接失败,自动重新连接,连接3次以上放弃连接,设置变量,来保存连接的次数
        let maxConnectTimes = 0
        //先确保数据库连接成功,在做其他的事情,这里使用Promise做一个异步操作
        return new Promise((resolve,reject)=>{
            //增加数据库检听事件
            mongoose.connection.on('disconnected',()=>{
                if(maxConnectTimes<3){
                    maxConnectTimes++
                    mongoose.connect(db)
                    console.log("******重新连接数据库*****")
                }else{
                    reject()
                        throw new Error("数据库有问题,请人为修改以后在连接")
                }
            })
            //连接报错以后
            mongoose.connection.on('error',err=>{
            console.log('***********数据库错误***********')
            if(maxConnectTimes<3){
                maxConnectTimes++
                mongoose.connect(db)   
              }else{
                eject(err)
                throw new Error('数据库出现问题,程序无法搞定,请人为修理......')
              }
            })
            //连接打开时
            mongoose.connection.once('open',()=>{
              console.log("MongoDB success")
              resolve()
            })
        })
    }
    

    二、使用Schema进行数据建模
    (1)数据库连接成功以后,使用Schema进行数据建模,定义好传输的字段和模型,Schema是一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,也就是说它不具备对数据库的操作能力。Schema是以key-value形式Json格式的数据。
    (2)Schema中的数据类型:
    1、String :字符串类型
    2、Number :数字类型
    3、Date : 日期类型
    4、Boolean: 布尔类型
    5、Buffer : NodeJS buffer 类型
    6、ObjectID : 主键,一种特殊而且非常重要的类型
    7、Mixed :混合类型
    8、Array :集合类型
    (3)Mongoose中的三个概念:
    1、schema :用来定义表的模版,实现和MongoDB数据库的映射。用来实现每个字段的类型,长度,映射的字段,不具备表的操作能力。
    2、model :具备某张表操作能力的一个集合,是mongoose的核心能力。我们说的模型就是这个Mondel。
    3、entity :类似记录,由Model创建的实体,也具有影响数据库的操作能力。
    (4)新建一个为schema.js的文件夹。并且执行代码:

    const mongoose = require('mongoose')		//声明mongoose
    const Schema = mongoose.Schema  		//引入Schema
    let ObjectId = Schema.Types.ObjectId    //声明Object类型
    
    //创建自己的用户Schema
    const userSchema = new Schema({
        UserId : ObjectId,   //固定写法
        username : {unique:true,type:String},  //设置用户名不允许重复,字符串格式
        password : String,
        createAt:{type:Date,default:Date.now()},
        lastLoginAt:{type:Date,default:Date.now()}
    }) 
    //发布模型   user为写入数据表的名称,userSchema 为发布模型的标准
    mongoose.model('user',userSchema )

    (5)载入Schema
    1、Schema建立好以后,需要载入它。在init.js里面做事件。然后在index.js里面执行。
    2、要载入Schema必须先引入:一个glob和一个resolve
    npm install glob --save //安装glob
    const glob = require('glob')
    const {resolve} = require('path')
    3、说明:
    glob:node的glob模块允许你使用 * 等符号,来写一个glob规则,像在shell里一样,获取匹配对应规则文件。
    resolve: 将一系列路径或路径段解析为绝对路径。
    4、了解两个引入的模块用法后,我们就可以一次性引入所有的Schema文件了。
    exports.initSchemas = () =>{
    //引入Schema的所有文件,根据文件夹的不同自己去调整
    glob.sync(resolve(__dirname,'./schema/','**/*.js')).forEach(require)
    }

    三、插入一条数据进行调试
    实际上一开始我们就应该先建立一个 index.js的文件。这个是主要的文件。来启动项目的。
    插入数据调试 代码:

    const Koa = require('koa')
    const app = new Koa()
    const mongoose = require('mongoose')
    const {connect , initSchemas} = require('./database/init.js')
    //立即执行函数,执行连接数据库的函数和载入Schema的函数
    ;(async () =>{
        await connect()
        initSchemas()
        const User = mongoose.model('user')   //user 是发布模型里面使用的表
        let oneUser = new user({userName:'jspang13',password:'123456'})   //插入数据
        oneUser.save().then(()=>{
                console.log('插入成功')
        })
        let  users = await  User.findOne({}).exec()
        console.log('------------------')
        console.log(users)
        console.log('------------------')  
    })()
    
    app.use(async(ctx)=>{
        ctx.body = '<h1>hello Koa2</h1>'
    })
    app.listen(3000,()=>{
        console.log('[Server] starting at port 3000')
    })
    

    四、使用bcryptjs用户加密处理
    1、bcryptjs是一个第三方密码加密库,是对原有bcrypt的优化,优点是不需要安装任何依赖
    npm install bcryptjs -S
    2、bcryptjs 和 Schema 写在一个文件里面 完整版代码:

    const mongoose = require('mongoose') //引入mongoose
    const Schema = mongoose.Schema //声明Schema
    let ObjectId = Schema.Types.ObjectId //声明Object类型
    
    const bcrypt = require('bcryptjs');
    
    const SALT_WORK_FACTOR = 10
    
    //创建用户的Shema  也就是用来定义 表的模板
    const userSchema = new Schema({
        UserId : ObjectId,
        userName : {unique:true,type:String},
        password : String,
        // _id:String,
        createAt:{type:Date,default:Date.now()},
        lastLoginAt:{type:Date,default:Date.now()}
    }) 
    
    // 用pre每次进行保存时都进行加盐加密的操作
    userSchema.pre('save',function(next){
        let _this = this
        bcrypt.genSalt(SALT_WORK_FACTOR,(err,salt)=>{
            if(err){
                return next(err)
            }
            //把密码传给hash进行加密。成功以后赋值给password属性
            bcrypt.hash(_this.password,salt,(err,hash)=>{
                if(err) return next(err)
                _this.password = hash
                next()
            })
        })
    })
    
    mongoose.model('User',userSchema)
    

    五、安装koa-router 并且使路由模块化
    1、安装:npm install koa-router --save
    2、新建一个sppApi的文件夹,然后在文件夹里面建立 user.js 代码如下:

    const Router = require ('koa-router')
    let router = new Router()
    router.get('/',async(ctx)=>{
        ctx.body="这是用户操作首页"
    })
    router.get('/register',async(ctx)=>{
        ctx.body="用户注册接口"
    })
    module.exports=router;
    

    3、让路由模块化,在index.js里面写入
    (1)引入 koa-router const Router = require('koa-router')
    (2)引入我们的user.js模块 let user = require('./appApi/user.js')
    (3)装载所有子路由 let router = new Router(); router.use('/user',user.routes())
    (4)加载路由中间件 app.use(router.routes()) app.use(router.allowedMethods())
    我们就可以在浏览器中实验一下我们的模块化路由是否起作用了。在浏览器中输入,http://localhost:3000/user,已经可以出现我们设定好的页面了。

    六、打通前后端的通讯。
    (1)安装koa2-cors中间件 解决前端跨域问题。
    (2)安装koa-bodyparser中间件 获取post提交的数据。
    (3)数据处理,返回。
    操作:index.js 服务端 文件中 优先 引入 koa2-cors 和 koa-bodyparser 代码如下:

    //解决跨域
    const cors = require('koa2-cors')
    app.use(cors());
    //链接数据库,前台和后台的通讯 ,接收post数据
    const bodyParser = require('koa-bodyparser')
    app.use(bodyParser()); 
    数据处理:(在koa-router的页面使用,或者直接使用,现在在koa-router文件夹下面使用)
    const Router = require('koa-router')
    const router = new Router()
    const mongoose = require('mongoose')
    
    router.get('/',async(ctx)=>{
        ctx.body = "用户操作首页"
    })
    
    router.post('/register',async(ctx)=>{
        console.log(ctx.request.body)
    
        //取得Model
        const User = mongoose.model('User');
        //把从前端接收的POST数据封装成一个新的user对象
        let newUser = new User(ctx.request.body)
    
        //用mongoose的save方法直接储存。然后判断是否成功返回相应的结果。
        await newUser.save().then(()=>{
            ctx.body = {
                code : 200,
                message:'注册成功'
            }
        }).catch((error)=>{
            ctx.body = {
                code:500,
                message:error
            }
        })
    })
    
    module.exports = router
    (4)前端业务逻辑代码
        axios({
                    url: url.registerUser,
                    method: 'post',
                    data:{
                        userName:this.username,
                        password:this.password ,
                    }
                })
                .then(response => {
                    console.log(response)
                    if(response.data.code==200){
                        Toast.success('注册成功');
                    }else{
                        Toast.fail('注册失败');
                    }
                })
                .catch((error) => {
                    console.log(error)
                })
    

      

  • 相关阅读:
    再见2011,展望2012!
    软件测试经验分享
    常用window命令
    测试报告编写
    酒桌上的计算机网络
    OA压力测试案例
    FileSystemObject和Folders使用详细介绍
    关于盘点的问题汇总
    PB 图表数据窗口操作
    sqlserver2005中行转列的方法
  • 原文地址:https://www.cnblogs.com/chengxiang123/p/9773224.html
Copyright © 2020-2023  润新知