zoukankan      html  css  js  c++  java
  • 02-个人博客笔记-登录注册接口的实现

    安装mongodb

    参考 http://www.runoob.com/mongodb...
    推荐使用 brew 安装

    安装完成后运行mongodb

    配置数据库,启动服务端

    1.安装mongoose
    使用npm下载模块时候会发现很慢,所以推荐淘宝的镜像。

    cnpm i mongoose --save

    2.在index.js中连接数据库

    // 加载数据库模块
    const mongoose = require("mongoose");
    mongoose.connect('mongodb://localhost:27017/testblog',function(err){
        if(err){
            console.log('数据库连接失败');
        }else{
            console.log('数据库连接成功');
            app.listen(4000);
        }
    });

    这里的testblog 是我们创建的数据库名称,终端运行node . 或者node index.js 打印数据库连接成功就说明服务已经启动

    注册接口实现

    1.在写接口之前还需要安装一个body-parser插件,body-parser是非常常用的一个express中间件,作用是对post请求的请求体进行解析。

    cnpm i body-parser --save

    在index.js中引入

    var bodyParser = require('body-parser');
    app.use(bodyParser.urlencoded({ extended: false }))
    app.use(bodyParser.json())

    2.在routers下新建user.js,配置路由

    const express = require('express');
    const router = express.Router();
    
    router.get('/regiest', function(res, rep) {
        rep.send('Hello, word!');
    });
    
    module.exports = router;

    在index.js中使用app.use('/user',require('./routers/user'));这种方式加载路由

    var express = require('express');
    var app = express();
    var bodyParser = require('body-parser');
    
    //  注意解析要放在上面
    app.use(bodyParser.urlencoded({ extended: false }))
    app.use(bodyParser.json())
    
    app.use('/user',require('./routers/user'));
    
    // 加载数据库模块
    const mongoose = require("mongoose");
    
    mongoose.connect('mongodb://localhost:27017/testblog',function(err){
        if(err){
            console.log('数据库连接失败');
        }else{
            console.log('数据库连接成功');
            app.listen(4000);
        }
    });

    重新启动服务,在浏览器中输入http://localhost:4000/user/regiest,可以看到打印信息说明路由配置成功。

    3.在schemas文件夹下新建user.js , 用户相关的Schema

    var mongoose = require('mongoose')
    
    module.exports = new mongoose.Schema({
        // 用户名
        userName: String,
        // 密码
        passWord: String,
        // 注册日期
        creatDate: Date,
        token: String
    })

    4.在models文件夹下新建user.js, 创建用户相关的模型,数据库的相关操作都是通过models下面我们创建的模型来操作的。

    var mongoose = require('mongoose')
    var userSchema = require('../schemas/user')
    module.exports = mongoose.model('User', userSchema)

    5.注册接口

    router.post('/regiest', function(req, res, next) {
        var userName = req.body.userName
        var password = req.body.passWord
        var rePassWord = req.body.rePassWord
    
        if (userName === '') {
            responseData.success = false
            responseData.message = '用户名不能为空'
            res.json(responseData)
            return
        }
        if (password === '') {
            responseData.success = false
            responseData.message = '密码不能为空'
            res.json(responseData)
            return
        }
        if (password !== rePassWord) {
            responseData.success = false
            responseData.message = '两次输入的密码不一致'
            res.json(responseData)
            return
        }
    
        User.findOne({
            userName: userName
        }).then((userInfo) => {
            if (userInfo) { // 数据库中有
                responseData.success = false
                responseData.message = '该用户已存在'
                res.json(responseData)
                return
            } else {
                // 写入数据库
                //获取hash值  密码加密
                var hash = bcrypt.hashSync(password, 10)
                //把hash值赋值给password变量
                password = hash
    
                var user = new User({
                    userName: userName,
                    passWord: password,
                    creatDate: new Date(),
                })
                return user.save()
            }
        }).then((newUserInfo) => {
            responseData.success = true
            responseData.message = '恭喜您,注册成功'
            responseData.data = {
                userName: newUserInfo.userName,
                userId: newUserInfo._id
            }
            res.json(responseData)
        })
    });

    其中bcrypt是加密相关的库

    cnpm i bcrypt --save

    重启服务,测试注册接口。

    6.启动blogclient,我们现在页面上放置几个简单的文本框来测试登录接口,关于blogclient的具体网络配置部分可参考具体的demo

    7.登录接口的要注意的是token的生成规则,依赖框jsonwebtoken和express-jwt

    cnpm i jsonwebtoken --save
    cnpm i express-jwt  --save
    // 登录
    const jwt = require('jsonwebtoken');
    router.post('/login', function (req, res, next) {
        var userName = req.body.userName
        var password = req.body.passWord
    
        User.findOne({
            userName: userName
        }).then((userInfo) => {
            if (userInfo) {
                // 判断密码是否正确
                const pwdMatchFlag = bcrypt.compareSync(password, userInfo.passWord);
                if (pwdMatchFlag) {
                    responseData.success = true
                    responseData.message = '登录成功'
                    responseData.data = {
                        userName: userInfo.userName,
                        userId: userInfo._id,
                        // token 有效期12h(60 * 60 * 12)
                        token: jwt.sign({
                            data: {_id:userInfo._id,username:userInfo.userName},
                            exp: Math.floor(Date.now() / 1000) + (60 * 60 * 12)
                        }, 'jwt-secret')
                    }
                    res.json(responseData)
                    return
                } else {
                    responseData.success = false
                    responseData.message = '密码错误'
                    res.json(responseData)
                    return
                }
            } else {
                responseData.success = false
                responseData.message = '该用户不存在'
                res.json(responseData)
                return
            }
        })
    });

    在index.js中导入

    var jwt = require('express-jwt');
    
    // token相关regiest和login不需要token验证
    var jwt = require('express-jwt');
    app.use(jwt({secret: 'jwt-secret', debug: true}).unless({
        path: ['/user/regiest', '/user/login']
    }))

    demo

    demo-02-个人博客笔记-登录注册接口的实现

    相关库

    express-jwt

    jsonwebtoken

    bcrypt

    body-parser

    项目上传  github 每次提交都是一个分支

    线上地址

    本文转载于:猿2048➨https://www.mk2048.com/blog/blog.php?id=hbihj2bj21j

  • 相关阅读:
    Java:类加载器(ClassLoader)
    Java 并发:Executor
    Java 并发:线程中断-interrupt
    UNIX IPC: POSIX 消息队列 与 信号
    Java与C++区别:重载(Overloading)
    UNIX IPC: POSIX 消息队列
    PAT 1078. Hashing
    PAT 1032. Sharing
    回顾经典问题算法:LIS, LCS-(DP类别)
    url编码模块
  • 原文地址:https://www.cnblogs.com/10manongit/p/12784318.html
Copyright © 2011-2022 走看看