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
浙公网安备 33010602011771号