国产69囗曝吞精在线视频,肥臀浪妇太爽了快点再快点,亚洲欧洲成人a∨在线观看,狠狠色丁香久久综合 ,国精一二二产品无人区免费应用,亚洲精品久久久久中文字幕,四虎一区二区成人免费影院网址 ,无码三级中文字幕在线观看

      node系列之?dāng)?shù)據(jù)接口注冊(cè)接口的實(shí)現(xiàn)(token驗(yàn)證登陸)

      2019-10-31    seo達(dá)人

      node系列之?dāng)?shù)據(jù)接口注冊(cè)登陸接口的實(shí)現(xiàn)

      1、使用express腳手架創(chuàng)建項(xiàng)目

      2、了解項(xiàng)目的目錄結(jié)構(gòu)

      3、準(zhǔn)備數(shù)據(jù)庫相關(guān)文件

      4、編寫注冊(cè)接口

      5、編寫登陸接口

      6、驗(yàn)證登陸實(shí)現(xiàn)

      7、預(yù)告

      1、使用express腳手架創(chuàng)建項(xiàng)目

      // 安裝腳手架,只需安裝一次

      npm i express-generator -g

      // 創(chuàng)建express項(xiàng)目

      express myapp --view=ejs

      cd myapp

      // 安裝依賴

      npm i 

      // 安裝需要使用的模塊

      // 數(shù)據(jù)庫模塊 用戶唯一id模塊 密碼加密模塊 token模塊

      npm i mongoose node-uuid bcryptjs jsonwebtoken -S



      2、了解項(xiàng)目的目錄結(jié)構(gòu)

      bin

      www ------- 服務(wù)器啟動(dòng)

      node_modules ------- 項(xiàng)目的依賴文件

      public ------- 靜態(tài)資源文件夾

      images ------- 靜態(tài)圖片

      javascripts ------- 靜態(tài)的js文件

      stylesheets ------- 靜態(tài)的樣式表文件

      routes ------- 路由文件

      index.js ------- 默認(rèn)的路由

      users.js ------- 用戶相關(guān)的路由

      views ------- 路由對(duì)應(yīng)的頁面

      index.ejs ------- 默認(rèn)的首頁

      error.ejs ------- 錯(cuò)誤頁面

      app.js ------- 使用中間件,注冊(cè)路由

      package.json ------- 描述文件

      3、準(zhǔn)備數(shù)據(jù)庫相關(guān)文件

      大勛在node系列之?dāng)?shù)據(jù)庫mongoose的封裝中給大家介紹了如何封裝mongoose,可以先行查看如何封裝,封裝的文件夾為sql,如果不想看的,可以直接通過網(wǎng)盤下載該文件夾



      將該sql文件放置項(xiàng)目的跟目錄下


      • myapp

        - sql

        - collection

        users.js

        db.js

        index.js



        4、編寫注冊(cè)接口

        目標(biāo)文件: myapp/routes/users.js



        實(shí)現(xiàn)思路:使用post提交數(shù)據(jù)的方式,先以手機(jī)號(hào)查詢有沒有該用戶,如果有該用戶,提示用戶該賬號(hào)已經(jīng)注冊(cè)過了;如果沒有該用戶,則可以完成注冊(cè),首先得將密碼加密,加密完成后插入數(shù)據(jù)庫



        代碼實(shí)現(xiàn):



        // 找到用戶集合

        var User = require('./../sql/collection/users');

        // 找到數(shù)據(jù)庫封裝文件

        var sql = require('./../sql');

        // 狀態(tài)碼的封裝

        var utils = require('./../utils')

        // 用戶唯一標(biāo)識(shí)的id

        var uuid = require('node-uuid');

        // 密碼加密模塊

        var bcrypt = require('bcryptjs');

        var salt = bcrypt.genSaltSync(10); // 加密級(jí)別



        // 實(shí)現(xiàn)注冊(cè)接口 -- post提交方式

        router.post('/register', (req, res, next) => {

          // 1、先獲取表單信息

          let { username, password, tel } = req.body;

          // 2、根據(jù)手機(jī)號(hào)查詢 用戶集合中是否有該用戶,如果有,返回有該賬戶,如果沒有注冊(cè)繼續(xù)

          sql.find(User, { tel }, { id: 0 }).then(data => {

            // 2.1 判斷有沒有該用戶

            if (data.length === 0) {

              // 2.2 沒有該用戶----繼續(xù)完成注冊(cè)操作

              // 2.2.1 生成用戶的id

              let userid = 'users
        ' + uuid.v1();

              // 2.2.2 對(duì)密碼加密

              password = bcrypt.hashSync(password, salt)

              // 2.2.3 插入數(shù)據(jù)庫

              sql.insert(User, { userid, username, password, tel}).then(() => {

                res.send(utils.registersuccess)

              })

            } else {

              // 2.3 已有該用戶

              res.send(utils.registered)

            }

          })

        })



        附 狀態(tài)碼封裝模塊 myapp/utils/index.js

        module.exports = {

          registered: {

            code: '10000',

            message: '該用戶已注冊(cè),請(qǐng)直接登錄' 

          },

          registersuccess: {

            code: '10101',

            message: '注冊(cè)成功' 

          }

        }



        5、編寫登陸接口

        目標(biāo)文件 myapp/routes/users.js

        實(shí)現(xiàn)思路:根據(jù)手機(jī)號(hào)查詢有沒有該用戶,如果沒有,提示用戶未注冊(cè),如果有該用戶,使用bcryptjs模塊驗(yàn)證密碼的有效性,如果有效,生成token,返回給前端相應(yīng)的token值。

        var jwt = require('jsonwebtoken');

        // 實(shí)現(xiàn)登陸功能

        router.post('/login', (req, res, next) => {

          // 1、獲取表單信息

          let { tel, password } = req.body;

          // 2、依據(jù)手機(jī)號(hào)查詢有沒有該用戶

          sql.find(User, { tel }, { _id: 0 }).then(data => {

            // 2.1 判斷有么有該用戶

            if (data.length === 0) {

              // 2.2 沒有該用戶

              res.send(utils.unregister)

            } else {

              // 2.3 有該用戶,驗(yàn)證密碼

              // 2.3.1 獲取數(shù)據(jù)庫中的密碼

              let pwd = data[0].password;

              // 2.3.2 比較 輸入的 密碼和數(shù)據(jù)庫中的密碼

              var flag = bcrypt.compareSync(password, pwd) // 前為輸入,后為數(shù)據(jù)庫

              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// 授權(quán)時(shí)效24小時(shí)

                })

                res.send({

                  code: '10010',

                  message: '登陸成功',

                  token: token

                })

              } else {

                // 2.3.4 密碼錯(cuò)誤

                res.send({

                  code: '10100',

                  message: '密碼錯(cuò)誤'

                })

              }

            }

          })

        })



        6、驗(yàn)證登陸實(shí)現(xiàn)

        目標(biāo)文件: myapp/app.js

        實(shí)現(xiàn)思路:很多的數(shù)據(jù)請(qǐng)求都需要登陸之后才能獲取到,在此統(tǒng)一封裝驗(yàn)證登陸

        // 引入token模塊

        var jwt = require('jsonwebtoken');

        // 全局的路由匹配

        app.use((req, res, next) => {

         // 排除登陸注冊(cè)頁面

          if (req.url !== '/users/login' && req.url !== '/users/register') {

          // 不同形式獲取token值

            let token = req.headers.token || req.query.token || req.body.token;

            // 如果存在token ---- 驗(yàn)證

            if (token) {

              jwt.verify(token, 'daxunxun', function(err, decoded) {

                if (err) {

                  res.send({ 

                    code: '10119', 

                    message: '沒有找到token.' 

                  });

                } else {

                  req.decoded = decoded;  

                  console.log('驗(yàn)證成功', decoded);

                  next()

                }

              }) 

            } else { // 不存在 - 告訴用戶---意味著未登錄

              res.send({ 

                code: '10119', 

                message: '沒有找到token.' 

              });

            }

          } else {

            next()

          }

        })




      日歷

      鏈接

      個(gè)人資料

      存檔

      主站蜘蛛池模板: 亚洲国产成人无码影片在线播放| 婷婷色国产精品视频一区 | 欧美亚洲日本国产黑白配| 最新中文乱码字字幕在线| 男生插女生网站| 精品偷自拍另类精品在线| 牛和人交videos欧美| 91免费在线视频| 日韩在线观看网址| 粗壮挺进人妻水蜜桃成熟| 欧美疯狂黑人xxxxbbbb| 精品欧美日韩| 成人小视频免费| 亚洲国产综合无码一区| 国产亚洲精品一区在线播放| 超碰av在线播放| 肉色超薄丝袜脚交69xx| 亚洲啪啪综合av一区| 免费大香伊蕉在人线国产卡| 欧美在线观看一区二区三区| 手机在线精品视频| 777精品出轨人妻国产| 亚洲另类伦春色综合| 国产山村乱淫老妇女视频| 在线观看日本网站| 99re6这里有精品热视频| 亚洲国产成人最新精品| 亚洲精品www久久久久久广东| 成人片在线免费看| 青草视频在线播放| 亚洲人成在线观看影院牛大爷| 欧美亚洲第一页| 国产美女主播视频| 无码精品人妻一区二区三区漫画| 欧美性生交xxxxx无码久久久| 黑人中文字幕一区二区三区| 99国产精品自拍| 国内精品伊人久久久久av| 广东少妇大战黑人34厘米视频| 阿的白色内裤hd中文| 骚狐网站|