日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Node.js实践----注册-登录-个人中心(更换密码、头像)接口实现(包含mysql数据库)

發布時間:2024/5/14 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Node.js实践----注册-登录-个人中心(更换密码、头像)接口实现(包含mysql数据库) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目結構目錄如下

  • 1.初始化
    • 1.1創建項目
    • 1.2 配置cors跨域
    • 1.3配置解析表單數據
    • 1.4初始化路由
    • 1.5抽離用戶路由模塊中的處理函數
  • 2.注冊登錄
    • 2.1新建ev_user表
    • 2.3注冊
      • 2.3.1檢測表單數據是否合法
      • 2.3.2檢測用戶名是否被占用
      • 2.3.3 對密碼進行加密處理
      • 2.3.4插入新用戶
    • 2.4 優化res.send()代碼
    • 2.5優化表單驗證
    • 2.6登錄
      • 2.6.1檢驗用戶提交的表單數據是否正確
      • 2.6.3服務器端生成jwt字符串
    • 2.7配置token中間件
  • 3.個人中心
    • 3.1獲取用戶信息
      • 3.1.1初始化路由模塊
      • 3.1.2初始化路由處理函數模塊
      • 3.1.3獲取用戶的基本信息
    • 3.2更新用戶的基本信息
      • 3.2.1
      • 3.2.2驗證表單數據
      • 3.2.3實現更新用戶基本信息的功能
    • 3.3重置密碼
      • 3.3.1定義路由和處理函數
      • 3.3.2驗證表單數據
      • 3.3.3重置密碼的功能
    • 3.4 用戶頭像信息更新
      • 3.4.1定義路由和處理函數
      • 3.4.2驗證表單數據
      • 3.4.3實現更新用戶頭像的功能

1.初始化

1.1創建項目

1.新建api_server文件,初始化包配置管理配置文件

npm init -y

2.安裝特定版本的express

npm i express@4.17.1

3.在根目錄中新建app.js作為 整個項目的入口文件,并初始化如下:

// 導入 express 模塊 const express = require('express')// 創建 express 的服務器實例 const app = express()// 調用 app.listen 方法,指定端口號并啟動web服務器 app.listen(8080, () => {console.log('api server running at http://127.0.0.1:8080') })

1.2 配置cors跨域

1.安裝cors

npm i cors@2.8.5

2.在app.js中導入并配置cors中間件

//導入并配置cors中間件 const cors = require('cors') //注冊為全局可用的中間件 app.use(cors())

1.3配置解析表單數據

1.配置解析表單數據的中間件

app.use(express.urlencoded({extended:false}))

1.4初始化路由

1.新建router文件夾,用來存放路由模塊。
2.在根目錄中,新建router_handler文件夾,用來存放所有路由處理函數模塊。
初始化路由模塊:

const router = express.Router()//注冊新用戶 router.post('/reguser', (req, res) => {res.send('reguser ok') }) //登錄 router.post('/login', (req, res) => {res.send('login ok')}) //將路由對象共享出去 module.exports=router

在app.js中導入用戶路由模塊

//導入并注冊路由模塊 const userRouter = require('./router/user') app.use('./api', userRouter)

1.5抽離用戶路由模塊中的處理函數

在router_handle/user.js中,使用exports對象,分別向外暴露如下兩個路由處理函數

//注冊處理函數 exports.regUser = (req, res) => {res.send('reguser ok') } //登錄處理函數 exports.login = (req, res) => {res.send('login ok') }

并且在router/user.js中進行調用

//導入用戶路由處理函數對應的模塊 const user_handler = require('../router_handler/user')//注冊新用戶 router.post('/reguser', user_handler.regUser)//登錄 router.post('/login', user_handler.login)

2.注冊登錄

2.1新建ev_user表

1.在my_db_01中新建ev_user表

2.安裝配置mysql模塊

npm i mysql@2.18.1

在根目錄中新建/db/index.js文件,在此定義模板中創建數據庫的連接對象

//導入mysql模塊 const mysql = require('mysql')//創建數據庫連接對象 const db = mysql.createPool({host: '127.0.0.1',user: 'root',password: 'admin',database: 'my_db_01'})//向外共享db數據庫連接對象 module.exports = db

2.3注冊

2.3.1檢測表單數據是否合法

//注冊處理函數 exports.regUser = (req, res) => {//獲取客戶端提交到服務器的用戶信息const userinfo = req.body//對表單數據進行合法校驗(為空)if (!userinfo.username || !userinfo.password)return res.send({ status: 1, message: '用戶名或密碼不合法' })console.log(userinfo);res.send('reguser ok')}

2.3.2檢測用戶名是否被占用

1.導入數據庫操作模塊

//導入數據庫操作模塊 const db = require('../db/index')

2.SQL語句(用戶名是否被占用)

//定義SQL語句,查詢用戶名是否被占用 const sqlStr = 'select * from ev_users where username=?' db.query(sqlStr, userinfo.username, (err, results) => {//執行SQL語句失敗if (err) {return res.send({ status: 1, message: err.message })}//判斷用戶名是否被占用if (results.length > 0) {return results.send({ status: 1, message: '用戶名被占用 ' })}//用戶名可以使用 })

2.3.3 對密碼進行加密處理

加密中后,無法被逆向破解
同一明文密碼多次加密,得到的加密結果各不相同,保證了安全性
安裝:

npm i bcryptjs@2.4.3

導入

//導入加密bcryptjs const bcrypt=require('bcryptjs')

確認用戶名之后,對密碼進行加密處理

userinfo.password = bcrypt.hashSync(userinfo.password, 10)

加密前后效果對比:

2.3.4插入新用戶

代碼:

//定義插入新用戶的插入語句const sql = 'insert into ev_users set ?'//調用db.query()執行SQL語句db.query(sql, { username: userinfo.username, password: userinfo.password }, (err, results) => {//判斷SQL語句是否執行成功if (err)return res.send({ status: 1, message: err.message })//判斷影響行數是否為1if (results.affectedRows !== 1)return res.send({ status: 1, message: '注冊新用戶失敗,請稍后再試' })//注冊用戶成功res.send({ status: 0, message: '注冊成功!' })})

遇到問題:
Field ‘id’ doesn’t have a default value
解決方案:
原因是因為mysql的中沒有將主鍵設置為自增,所以在增加元素時獲取生成主鍵時出現異常,打開Navicat,點擊表右鍵->設計表 到下面的頁面 選擇自動遞增,保存即可

解決后成功注冊

2.4 優化res.send()代碼

因為在處理函數中,需要多次調用res.send()向客戶端響應處理失敗的結果,于是可以手動封裝一個res.cc函數
1.在app.js入口文件中,所有路由之前,聲明一個全局中間件,為res 對象掛在一個res.cc()函數

//封裝res.cc函數 app.use((req, res, next) => {//status默認值為1,表示失敗的情況//err的值,可能是一個錯誤對象,也可能是一個錯誤的描述字符串res.cc = function(err, status = 1) {res.send({status,message: err instanceof Error ? err.message : err,})}next() })

2.5優化表單驗證

1.安裝@hapi/joi包,為表單中攜帶的每個數據項,定義驗證規則

npm install joi

2.安裝@escook/express-joi中間件,實現自動對表單數據進行驗證的功能

npm i @escook/express-joi

3.新建/schema/user.js用戶信息驗證規則模塊,并初始化代碼如下

//導入定義驗證規則的包 const joi = require('@hapi/joi')//定義用戶名和密碼的驗證規則 const username = joi.string().alphanum().min(1).max(10).required() const password = joi.string().pattern(/^[\S]{6,12}$/).required()//定義驗證注冊和登錄表單數據的規則對象 exports.reg_login_schema = {body: {username,password} }

2.6登錄

1.檢驗表單數據是否合法
2.根據用戶名查詢用戶的數據
3.判斷用戶輸入的密碼是否正確
4.生成JWT的token字符串

2.6.1檢驗用戶提交的表單數據是否正確

注冊用戶登錄使用的是同一種校驗規則:

//登錄處理函數 exports.login = (req, res) => {//接收表單數據const userinfo = req.body//定義SQL數據const sql = 'select * from ev_users where username=?'//執行SQL語句,根據用戶名查詢用戶的信息db.query(sql, userinfo.username, (err, results) => {//執行SQL語句失敗if (err) return res.cc(err)//執行SQL語句成功,但是獲取數據條數不是1if (results.length !== 1)return res.cc('登錄失敗')//判斷密碼是否正確})res.end('login ok') }

2.6.3服務器端生成jwt字符串

1.通過ES6高級語法,快速剔除用戶的密碼和頭像的值

//在服務器端生成Token的字符串,后面跟進的兩項被踢出const user = {...results[0] ,password:'',user_pic:''}console.log(user);

2.運行如下的命令,安裝Token字符串的包

npm i jsonwebtoken@8.5.1

3.在/router_handler/user.js導入這個包

//導入生成Token的包 const jwt = require('jsonwebtoken')

4.在根目錄新建文件夾config.js,寫入下面代碼。建議秘鑰有效時間寫得久一點,不然很快就失效了,需要重新生成,比較麻煩。

///這是一個全局的配置文件module.exports = {//加密和解密Token的秘鑰jwtSecretKey: 'itheima',//token的有效期expiresIn: '100h' }

5.在路由函數管理文件/router_handler/user.js中導入

//導入全局的配置文件 const config = require('../config')

6.把用戶信息對象加密成Token字符串

//對用戶的信息進行加密,生成Token字符串const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })// //調用res.send()將Token響應給客戶端// console.log(tokenStr);res.send({status: 0,message: '登錄成功',token: 'Bearer ' + tokenStr})

用戶登錄成功就會生成token字符串

2.7配置token中間件

1.安裝Token中間件

npm i express-jwt@5.3.3

2.注冊中間件,在app.js入口文件中注冊路由之前,配置解析Token的中間件

//一定在路由之前配置解析Token中間件 const expressJWT = require('express-jwt') const config = require('./config') app.use(expressJWT({ secret: config.jwtSecretKey }).unless({ path: [/^\/api/] }))//導入并注冊路由模塊 const userRouter = require('./router/user')

3.在app.js入口文件中的錯誤中間件里面,捕獲并且處理Token認證失敗后的錯誤

//定義錯誤級別中間件 app.use((err, req, res, next) => {//驗證失敗導致的錯誤if (err instanceof Joi.ValidationError) return res.cc(err)//身份認證失敗后的錯誤if (err.name === 'UnauthorizedError') return res.cc('身份認證失敗')//未知的錯誤return res.cc(err) })

如果出現報錯情況: jwt expired
解決方案:重新進行登錄操作,會生成新的token字符串作為請求頭信息,以這個新的請求頭發送請求,可以生效

3.個人中心

3.1獲取用戶信息

1.初始化路由模塊
2.初始化路由處理函數模塊
3.獲取用戶的基本信息

3.1.1初始化路由模塊

1.創建/router/userinfo.js模塊

//導入express const express = require('express')//創建路由對象 const router = express.Router()//掛載路由//獲取用戶的基本信息 router.get('/userinfo', (req, res) => {res.send('ok')})//向外共享路由對象 module.exports = router

2.在app.js入口文件中導入個人中心路由

//導入并使用用戶信息的路由模塊 const userinfoRouter = require('./router/userinfo') app.use('/my', userinfoRouter)

由于個人信息這個接口設置了權限,需要在請求頭里面加入一個認證的字段,value里面是前面生成的token字段

路由成功運行!

3.1.2初始化路由處理函數模塊

1.在/router_handler新建文件userinfo.js路由處理函數模塊,并初始化

exports.getUserInfo = (req, res) => {res.send('ok') }

2./router/userinfo.js代碼

//導入express const express = require('express')//創建路由對象 const router = express.Router()//掛載路由//導入路由處理函數模塊 const userinfo_handler = require('../router_handler/userinfo')//獲取用戶的基本信息 router.get('/userinfo', userinfo_handler.getUserInfo)//向外共享路由對象 module.exports = router

3.1.3獲取用戶的基本信息

1.導入數據庫

const db = require('../db/index')

2.定義SQL語句

//根據用戶的id,查詢用戶的基本信息//防止用戶的密碼泄漏,需要排除password字段 const sql = 'select id,username,nickname,email,user_pic from ev_users where id=?'

3.調用db.qurey()執行語句

//定義SQL語句//根據用戶的id,查詢用戶的基本信息//防止用戶的密碼泄漏,需要排除password字段const sql = 'select id,username,nickname,email,user_pic from ev_users where id=?'//調用db.query()執行SQL語句db.query(sql, req.user.id, (err, results) => {//執行SQL語句失敗if (err) return res.cc(err)//執行SQL語句成功,但是查詢的結果可能為空if (results.length !== 1) return res.cc('獲取用戶信息失敗')//用戶信息獲取成功res.send({ status: 0, message: '獲取用戶信息成功', data: results[0] })})

3.2更新用戶的基本信息

1.定義路由和處理函數
2.驗證表單數據
3.實現更新用戶基本信息的功能

3.2.1

1.在/router/userinfo.js文件中,新增更新用戶信息的接口

router.post('/userinfo', userinfo_handler.updateUserInfo)

2.在/router_handler/userinfo.js文件中,定義向外共享

exports.updateUserInfo = (req, res) => {res.send('ok') }

3.2.2驗證表單數據

1.在/schema/user.js驗證規則模塊中,定義id,nickname,email的驗證規則

const id = joi.number().integer().min().required() const nickname = joi.string().required() const email = joi.string().email().required()

2.向外共享

exports.update_userinfo_schema = {body: {id,nickname,email} }

3.在router/userinfo.js模塊中,導入驗證數據合法性的中間件

//導入驗證數據的中間件 const expressJoi = require('@escook/express-joi')//2.導入需要的驗證規則 const { update_userinfo_schema } = require('../schema/user') router.post('/userinfo', expressJoi(update_userinfo_schema), userinfo_handler.updateUserInfo)

3.2.3實現更新用戶基本信息的功能

修改router_handler/userinfo.js代碼

//更新用戶基本信息的處理函數 exports.updateUserInfo = (req, res) => {//定義執行的SQL語句const sql = 'update ev_users set ? where id=?'//調用db.query執行SQL語句并傳遞參數db.query(sql, [req.body, req.body.id], (err, results) => {//執行SQL語句失敗遼if (err) return res.cc(err)//執行SQL語句成功,但是影響行數不等于1if (results.affectedRows !== 1) return res.cc('更新用戶基本信息失敗')//成功res.cc('更新用戶信息成功', 0)}) }


3.3重置密碼

1.定義路由和處理函數
2.驗證表單數據
3.實現重置密碼的功能

3.3.1定義路由和處理函數

1.在/router/userinfo.js模塊中,新增重置密碼的路由

router.post('/updatepwd', userinfo_handler.updatePassword)

2.在/router_handler/userinfo.js模塊,定義并向外共享重置密碼的路由處理函數

exports.updatePassword = (req, res) => {res.send('ok') }

3.3.2驗證表單數據

1.在/schema/user.js模塊,使用exports向外共享

exports.update_password_schema = {body: {oldPwd: password,//joi.ref 表示新舊一致//2.joi.not表示newPwd的值不能等于舊密碼的值//3..concat表示合并新的和舊的密碼驗證規則newPwd: joi.not(joi.ref('oldPwd')).concat(password)} }

2.在router/userinfo.js

//導入需要的驗證規則對象 const { update_userinfo_schema, update_password_schema } = require('../schema/user') router.post('/updatepwd', expressJoi(update_password_schema), userinfo_handler.updatePassword)

3.3.3重置密碼的功能

1.根據id查詢用戶是否存在

//更新用戶密碼的處理函數 exports.updatePassword = (req, res) => {//根據id查詢用戶的信息const sql = 'select * from ev_users where id=?'//執行根據id查詢用戶信息的SQL語句db.query(sql, req.user.id, (err, results) => {//執行SQL語句失敗遼if (err) return res.cc(err)//執行SQL語句成功,但是影響行數不等于1if (results.length !== 1) return res.cc('更新用戶基本信息失敗')//成功res.cc('ok')})}

2.判斷提交的舊密碼是否正確

const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password)if (compareResult) return res.cc('舊密碼錯誤')

3.對新密碼進行bcrypt加密之后,更新到數據庫中

//更新數據庫中的密碼//定義更新密碼的SQL語句const sql = 'update ev_users set password=? where id=?'//對新密碼進行加密處理const newPwd = bcrypt.hashSync(req.body.newPwd, 10)//調用db.query()執行SQL語句db.query(sql, [newPwd, req.user.id], (err, results) => {//執行SQL語句失敗遼if (err) return res.cc(err)//執行SQL語句成功,但是影響行數不等于1if (results.affectedRows !== 1) return res.cc('更新用戶基本信息失敗')//成功res.cc('更新用戶信息成功', 0)})

總代碼:

//更新用戶密碼的處理函數 exports.updatePassword = (req, res) => {//根據id查詢用戶的信息const sql = 'select * from ev_users where id=?'//執行根據id查詢用戶信息的SQL語句db.query(sql, req.user.id, (err, results) => {//執行SQL語句失敗遼if (err) return res.cc(err)//執行SQL語句成功,但是影響行數不等于1if (results.length !== 1) return res.cc('更新用戶基本信息失敗')//成功//判斷密碼是否正確const compareResult = bcrypt.compareSync(req.body.oldPwd, results[0].password)if (compareResult) return res.cc('舊密碼錯誤')//更新數據庫中的密碼//定義更新密碼的SQL語句const sql = 'update ev_users set password=? where id=?'//對新密碼進行加密處理const newPwd = bcrypt.hashSync(req.body.newPwd, 10)//調用db.query()執行SQL語句db.query(sql, [newPwd, req.user.id], (err, results) => {//執行SQL語句失敗遼if (err) return res.cc(err)//執行SQL語句成功,但是影響行數不等于1if (results.affectedRows !== 1) return res.cc('更新用戶基本信息失敗')//成功res.cc('更新用戶信息成功', 0)})})}

3.4 用戶頭像信息更新

3.4.1定義路由和處理函數

1.在/router/userinfo.js模塊中,新增更換用戶頭像路由

router.post('/update/avatar', userinfo_handler.updateAvatar)

2./router_handler/userinfo.js模塊中,定義向外共享更新頭像的路由處理函數

//更新用戶頭像的處理函數 exports.updateAvatar = (req, res) => {res.send('ok') }

3.4.2驗證表單數據

1./schema/user.js,定義驗證規則如下:

const avatar = joi.string().dataUri().required() //更新頭像//驗證規則對象--更換頭像 exports.update_avatar_schema = {body: {avatar} }

2./router/userinfo.js.導入需要的的驗證規則對象

//更換頭像驗證規則對象 const { update_avatar_schema } = require('../schema/user')//更換頭像路由 router.post('/update/avatar', expressJoi(update_avatar_schema), userinfo_handler.updateAvatar)

3.4.3實現更新用戶頭像的功能

//更新用戶頭像的處理函數 exports.updateAvatar = (req, res) => {const sql = 'update ev_users set user_pic=? where id=?'db.query(sql, [req.body.avatar, req.user.id], (err, results) => {//執行SQL語句失敗遼if (err) return res.cc(err)//執行SQL語句成功,但是影響行數不等于1if (results.affectedRows !== 1) return res.cc('更新頭像失敗')//成功return res.cc('更新頭像成功', 0)}) }

總結

以上是生活随笔為你收集整理的Node.js实践----注册-登录-个人中心(更换密码、头像)接口实现(包含mysql数据库)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。