node系列之数据接口注册接口的实现(token验证登陆) - 蓝蓝设计_UI设计公司

帝皇彩票官网

追求卓越一诺千金

蓝蓝设计,2011年成立,主创清华团队,专注软件和互联网ui设计开发。擅长企业信息化管理、监控、大数据软件UIUE咨询和设计开发服务。立足UI,好好学习,天天进步!


node系列之数据接口注册接口的实现(token验证登陆)

2019-10-31 释然 前端及开发文章及欣赏


node系列之数据接口注册登陆接口的实现
1、使用express脚手架创建项目
2、了解项目的目录结构
3、准备数据库相关文件
4、编写注册接口
5、编写登陆接口
6、验证登陆实现
7、预告
1、使用express脚手架创建项目
// 安装脚手架,只需安装一次
npm i express-generator -g
// 创建express项目
express myapp --view=ejs
cd myapp
// 安装依赖
npm i 
// 安装需要使用的模块
// 数据库模块 用户唯一id模块 密码加密模块 token模块
npm i mongoose node-uuid bcryptjs jsonwebtoken -S

2、了解项目的目录结构
bin
www ------- 服务器启动
node_modules ------- 项目的依赖文件
public ------- 静态资源文件夹
images ------- 静态图片
javascripts ------- 静态的js文件
stylesheets ------- 静态的样式表文件
routes ------- 路由文件
index.js ------- 默认的路由
users.js ------- 用户相关的路由
views ------- 路由对应的页面
index.ejs ------- 默认的帝皇彩票
error.ejs ------- 错误页面
app.js ------- 使用中间件,注册路由
package.json ------- 描述文件
3、准备数据库相关文件
大勋在node系列之数据库mongoose的封装中给大家介绍了如何封装mongoose,可以先行查看如何封装,封装的文件夹为sql,如果不想看的,可以直接通过网盘下载该文件夹

将该sql文件放置项目的跟目录下

- myapp
- sql
- collection
users.js
db.js
index.js

4、编写注册接口
目标文件: myapp/routes/users.js

实现思路:使用post提交数据的方式,先以手机号查询有没有该用户,如果有该用户,提示用户该账号已经注册过了;如果没有该用户,则可以完成注册,首先得将密码加密,加密完成后插入数据库

代码实现:

// 找到用户集合
var User = require('./../sql/collection/users');
// 找到数据库封装文件
var sql = require('./../sql');
// 状态码的封装
var utils = require('./../utils')
// 用户唯一标识的id
var uuid = require('node-uuid');
// 密码加密模块
var bcrypt = require('bcryptjs');
var salt = bcrypt.genSaltSync(10); // 加密级别

// 实现注册接口 -- post提交方式
router.post('/register', (req, res, next) => {
  // 1、先获取表单信息
  let { username, password, tel } = req.body;
  // 2、根据手机号查询 用户集合中是否有该用户,如果有,返回有该账户,如果没有注册继续
  sql.find(User, { tel }, { _id: 0 }).then(data => {
    // 2.1 判断有没有该用户
    if (data.length === 0) {
      // 2.2 没有该用户----继续完成注册操作
      // 2.2.1 生成用户的id
      let userid = 'users_' + uuid.v1();
      // 2.2.2 对密码加密
      password = bcrypt.hashSync(password, salt)
      // 2.2.3 插入数据库
      sql.insert(User, { userid, username, password, tel}).then(() => {
        res.send(utils.registersuccess)
      })
    } else {
      // 2.3 已有该用户
      res.send(utils.registered)
    }
  })
})

附 状态码封装模块 myapp/utils/index.js
module.exports = {
  registered: {
    code: '10000',
    message: '该用户已注册,请直接登录' 
  },
  registersuccess: {
    code: '10101',
    message: '注册成功' 
  }
}

5、编写登陆接口
目标文件 myapp/routes/users.js
实现思路:根据手机号查询有没有该用户,如果没有,提示用户未注册,如果有该用户,使用bcryptjs模块验证密码的有效性,如果有效,生成token,返回给前端相应的token值。
var jwt = require('jsonwebtoken');
// 实现登陆功能
router.post('/login', (req, res, next) => {
  // 1、获取表单信息
  let { tel, password } = req.body;
  // 2、依据手机号查询有没有该用户
  sql.find(User, { tel }, { _id: 0 }).then(data => {
    // 2.1 判断有么有该用户
    if (data.length === 0) {
      // 2.2 没有该用户
      res.send(utils.unregister)
    } else {
      // 2.3 有该用户,验证密码
      // 2.3.1 获取数据库中的密码
      let pwd = data[0].password;
      // 2.3.2 比较 输入的 密码和数据库中的密码
      var flag = bcrypt.compareSync(password, pwd) // 前为输入,后为数据库
      if (flag) {
        // 2.3.3 密码正确,生成token
        let userid = data[0].userid
        let username = data[0].username
        let token = jwt.sign({ userid, username }, 'daxunxun', {
          expiresIn: 60*60*24// 授权时效24小时
        })
        res.send({
          code: '10010',
          message: '登陆成功',
          token: token
        })
      } else {
        // 2.3.4 密码错误
        res.send({
          code: '10100',
          message: '密码错误'
        })
      }
    }
  })
})

6、验证登陆实现
目标文件: myapp/app.js
实现思路:很多的数据请求都需要登陆之后才能获取到,在此统一封装验证登陆
// 引入token模块
var jwt = require('jsonwebtoken');
// 全局的路由匹配
app.use((req, res, next) => {
 // 排除登陆注册页面
  if (req.url !== '/users/login' && req.url !== '/users/register') {
  // 不同形式获取token值
    let token = req.headers.token || req.query.token || req.body.token;
    // 如果存在token ---- 验证
    if (token) {
      jwt.verify(token, 'daxunxun', function(err, decoded) {
        if (err) {
          res.send({ 
            code: '10119', 
            message: '没有找到token.' 
          });
        } else {
          req.decoded = decoded;  
          console.log('验证成功', decoded);
          next()
        }
      }) 
    } else { // 不存在 - 告诉用户---意味着未登录
      res.send({ 
        code: '10119', 
        message: '没有找到token.' 
      });
    }
  } else {
    next()
  }
})


标签: node系列之数据接口注册接口的实现(token验证登陆) « 案例分享:RARRA模型下,如何做用户增长? | 想让视觉层次更加清晰?来看这篇视觉间隔方法完全梳理!»


蓝蓝 http://www.bjhbys.com

  1. 2019年11月(1)
  2. 2019年10月(53)
  3. 2019年9月(48)
  4. 2019年8月(63)
  5. 2019年7月(59)
  6. 2019年6月(59)
  7. 帝皇彩票官网2019年5月(31)
  8. 2019年4月(37)
  9. 2019年3月(43)
  10. 2019年2月(26)
  11. 2019年1月(45)
  12. 2018年12月(41)
  13. 2018年11月(40)
  14. 2018年10月(29)
  15. 2018年9月(40)
  16. 2018年8月(87)
  17. 2018年7月(107)
  18. 2018年6月(86)
  19. 2018年5月(110)
  20. 2018年4月(40)
  21. 2018年3月(35)
  22. 2017年8月(35)
  23. 2017年7月(45)
  24. 2017年6月(7)
  25. 2017年5月(27)
  26. 2017年4月(51)
  27. 2017年3月(70)
  28. 2017年2月(65)
  29. 2017年1月(69)
  30. 2016年12月(55)
  31. 2016年11月(111)
  32. 2016年10月(92)
  33. 2016年9月(53)
  34. 2016年8月(9)
  35. 2016年7月(4)
  36. 2016年6月(9)
  37. 帝皇彩票官网2016年3月(19)
  38. 2016年2月(26)
  39. 2016年1月(30)
  40. 2015年12月(33)
  41. 2015年11月(35)
  42. 2015年10月(46)
  43. 2015年9月(43)
  44. 2015年8月(40)
  45. 2015年7月(33)
  46. 帝皇彩票官网2015年6月(46)
  47. 2015年5月(58)
  48. 2015年4月(70)
  49. 2015年3月(55)
  50. 2015年2月(17)
  51. 2015年1月(33)
  52. 2014年12月(21)
  53. 2014年11月(84)
  54. 2014年10月(94)
  55. 2014年9月(6)
  56. 2014年8月(1)
  57. 2014年7月(13)
  58. 2014年6月(66)
  59. 2014年5月(99)
  60. 2014年4月(88)
  61. 2014年3月(102)
  62. 2014年2月(68)
  63. 2014年1月(83)
  64. 帝皇彩票官网2013年12月(106)
  65. 2013年11月(112)
  66. 2013年10月(61)
  67. 2013年9月(20)
  68. 2013年7月(13)
  69. 2013年6月(27)
  70. 2013年5月(48)
  71. 2013年4月(39)
  72. 2013年3月(8)
  73. 2013年2月(20)
  74. 2013年1月(31)
  75. 2012年12月(33)
  76. 2012年11月(31)
  77. 2012年10月(23)
  78. 2012年9月(8)
  79. 2012年7月(14)
  80. 2012年6月(15)
  81. 帝皇彩票官网2012年5月(31)
  82. 帝皇彩票官网2012年4月(24)
  83. 2012年2月(4)
  84. 2012年1月(8)
  85. 2011年12月(35)
  86. 2011年11月(32)
  87. 2011年10月(13)
  88. 2011年8月(1)
  89. 2011年6月(1)
订阅Rss
大象彩票APP 桔子彩票网址 迪士尼彩乐园app 帝皇彩票登陆 福建11选5 大象彩票计划 状元彩票开奖 吉利彩票投注 状元彩票开奖 状元彩票官网