• node 实现Token状态登录 及数据库增删改查


    1.项目目录结构

    2.启动入口文件代码index.js

    const express = require('express')
    const bodyParser = require('body-parser')
    const cookieParser = require('cookie-parser')
    
    const userRouter = require('./user')
    const personRouter = require('./person')
    const checkToken = require('./check_token')
    
    const app = express()
    app.use(cookieParser())
    app.use(bodyParser.json())
    
    app.use('/api',userRouter)
    app.use('/api',checkToken,personRouter)
    app.listen(9093, function() {
        console.log('Node app start at port 9093')
    });

    3.mongoose连接数据库model.js

    const mongoose = require('mongoose');
    // 链接mongo 并且使用imooc这个集合
    const DB_URL = 'mongodb://localhost:27017/demo';
    mongoose.connect(DB_URL);
    
    
    const models = {
        user:{
            'user':{type:String, 'require':true},
            'pwd':{type:String, 'require':true},
            'type':{'type':String, 'require':true},
            //头像
            'avatar':{'type':String},
            // 个人简介或者职位简介
            'desc':{'type':String},
            // 职位名
            'title':{'type':String},
            // 如果你是boss 还有两个字段
            'company':{'type':String},
            'money':{'type':String}
        },
        person:{
            //创建时间
            date:{'type':String},
            //联系人名字
            name:{type:String},
            //联系人年龄
            age:{type:Number},
            //联系人性别
            sex:{'type':String},
            //联系人地址
            address:{'type':String}
        }
    };
    
    for(let m in models){
        mongoose.model(m, new mongoose.Schema(models[m]))
    };
    
    module.exports = {
        getModel:function(name){
            return mongoose.model(name)
        }
    };

    4.登录逻辑处理user.js

    const express = require('express')
    const utils = require('utility')
    const sd = require('silly-datetime')
    const jwt = require('jsonwebtoken')
    
    const Router = express.Router()
    const model = require('./model')
    const User = model.getModel('user')
    const _filter = { 'pwd': 0, '__v': 0 }
    const secret = 'zero'
    
    Router.post('/loginRegister', function(req, res) {
        const { user, pwd } = req.body
        User.findOne({ user }, function(err, doc) {
            if (doc) {
                if (doc.pwd != md5Pwd(pwd)) {
                    return res.json({ code: 1, msg: '用户名或者密码错误' })
                } else {
                    let token = jwt.sign(doc.toJSON(), secret, {
                        expiresIn: 60 * 60  //秒到期时间
                    });
                    let { _id, user } = doc
                    return res.json({ code: 0, data: { _id, user, token } })
                }
            } else {
                const userModel = new User({ user, pwd: md5Pwd(pwd) })
                userModel.save(function(e, d) {
                    if (e) {
                        return res.json({ code: 1, msg: '后端出错了' })
                    }
                    let token = jwt.sign(d.toJSON(), secret, {
                        expiresIn: 60 * 60 //秒到期时间
                    });
                    let { _id, user } = d
                    return res.json({ code: 0, data: { _id, user, token } })
                })
            }
        })
    
    })
    
    function md5Pwd(pwd) {
        const salt = '!@~#Zero389409258'
        return utils.md5(utils.md5(pwd + salt))
    }
    
    
    module.exports = Router;

    5.token验证中间件check_token.js

    var jwt = require('jsonwebtoken')
    const secret = 'zero'
    module.exports = function(req, res, next) {
        //检查post的信息或者url查询参数或者头信息
        var token = req.body.token || req.query.token || req.headers['x-access-token']
        // 解析 token
        if (token) {
            // 确认token
            jwt.verify(token, secret, function(err, decoded) {
                if (err) {
                    return res.json({ code: 1, msg: 'token信息错误或失效!' })
                } else {
                    // 如果没问题就把解码后的信息保存到请求中,供后面的路由使用
                    req.api_user = decoded
                    next()
                }
            });
        } else {
            // 如果没有token,则返回错误
            return res.status(403).send({
                code: 1,
                msg: '没有提供token!'
            })
        }
    }

    6.mongoose增删改查person.js

    const express = require('express')
    const utils = require('utility')
    const sd = require('silly-datetime')
    const jwt = require('jsonwebtoken')
    
    const Router = express.Router()
    const model = require('./model')
    const Person = model.getModel('person')
    const _filter = { 'pwd': 0, '__v': 0 }
    
    
    Router.post('/personSave', function(req, res) {
        const { name, sex, age, address, _id } = req.body
        const body = req.body
        let date = sd.format(new Date(), 'YYYY-MM-DD HH:mm')
        const personModel = new Person({ name, sex, age, address, date })
        if (_id == '') {
            personModel.save(function(e, doc) {
                if (e) {
                    return res.json({ code: 1, msg: '后端出错了' })
                }
                return res.json({ code: 0, data: { name, sex, age, address, _id } })
            })
        } else {
            Person.findByIdAndUpdate(_id, { name, sex, age, address }, function(err, doc) {
                const data = Object.assign({}, doc)
                return res.json({ code: 0, data: data })
            })
        }
    })
    
    Router.post('/personRemove', function(req, res) {
        const _id = req.body._id;
        Person.findByIdAndRemove(_id, function(err, doc) {
            return res.json({ code: 0, data: doc })
        })
    
    })
    
    Router.get('/personList', function(req, res) {
        Person.find({})
            .skip(0)
            .limit(10)
            .sort({ '_id': -1 })
            .exec(function(err, doc) {
                Person.count({}, function(err, count) {
                    let data = {
                        count: count,
                        personDataList: doc
                    }
                    return res.json({ code: 0, data: data })
                })
            });
    
    })
    
    module.exports = Router;

    项目运行需启动本地mongodb

    完整项目具体demo贴上 github : https://github.com/zhuzeliang/node-vue-demo

  • 相关阅读:
    Visualizing Concurrency in Go · divan's blog
    Trac常用插件描述!
    分布式 OLTP 数据库
    【SDCC讲师专访】PingCAP联合创始人兼CEO刘奇:好的产品应开源,不闭门造车-CSDN.NET
    XiaoMi/themis: Themis provides cross-row/cross-table transaction on HBase based on google's percolator.
    TiDB首页、文档和下载
    TeamGantt vs JIRA 2016 Comparison | FinancesOnline
    HandlerInterceptor拦截实现对PathVariable变量的读取
    大叔来说说Markdown的使用
    springcloud~配置中心实例搭建
  • 原文地址:https://www.cnblogs.com/zhuzeliang/p/9028592.html
Copyright © 2020-2023  润新知