<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • node系列之數據接口注冊接口的實現(token驗證登陸)

          2019-10-31    seo達人

          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: 606024// 授權時效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()

              }

            })




          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://m.sdgs6788.com

          存檔

          色播久久人人爽人人爽人人片aV | 97精品依人久久久大香线蕉97| 成人精品一区二区久久久| 久久久久亚洲精品无码网址| 精品国产青草久久久久福利| 久久综合久久综合久久| 亚洲精品乱码久久久久久不卡| 久久久精品国产sm调教网站| 很黄很污的网站久久mimi色| 国产A级毛片久久久精品毛片| 国产福利电影一区二区三区,免费久久久久久久精 | 欧美日韩精品久久久久| 色成年激情久久综合| 久久91精品国产91| 精品久久人人妻人人做精品| 亚洲国产精品18久久久久久| 久久综合九色欧美综合狠狠| 青青青青久久精品国产h| 99精品国产99久久久久久97| 亚洲国产天堂久久综合| 亚洲国产精久久久久久久| 久久精品99久久香蕉国产色戒| 色播久久人人爽人人爽人人片AV | 色婷婷久久综合中文久久蜜桃av | 国产AⅤ精品一区二区三区久久 | 精品久久久无码21p发布| 久久久久亚洲?V成人无码| 久久免费精品视频| 久久99热国产这有精品| 99国产欧美精品久久久蜜芽| 亚洲乱码中文字幕久久孕妇黑人| 亚洲国产精品综合久久一线| 亚洲日本va午夜中文字幕久久| 日日狠狠久久偷偷色综合0 | 奇米综合四色77777久久| 亚洲va国产va天堂va久久| 久久久久久久久久久久久久| 亚洲综合伊人久久综合| 久久久这里有精品| 亚洲国产欧美国产综合久久| 欧洲人妻丰满av无码久久不卡|