国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

高性能服務器Nodejs操作Mysql數(shù)據(jù)庫

這篇具有很好參考價值的文章主要介紹了高性能服務器Nodejs操作Mysql數(shù)據(jù)庫。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


1 Node 操作 mysql

高性能服務器Nodejs操作Mysql數(shù)據(jù)庫,front,數(shù)據(jù)庫,服務器,mysql

數(shù)據(jù)庫和身份認證

配置 mysql 模塊

  1. 安裝 mysql 模塊
npm install mysql
  1. 建立連接
const mysql = require('mysql')

const db = mysql.createPool({
  host: '127.0.0.1',
  user: 'root',
  password: 'root',
  database: 'test',
})
  1. 測試是否正常工作
db.query('select 1', (err, results) => {
  if (err) return console.log(err.message)
  console.log(results)
})

1.2 操作 mysql 數(shù)據(jù)庫

  1. 查詢數(shù)據(jù)
db.query('select * from users', (err, results) => {
  ...
})
  1. 插入數(shù)據(jù)
// ? 表示占位符
const sql = 'insert into users values(?, ?)'
// 使用數(shù)組的形式為占位符指定具體的值
db.query(sql, [username, password], (err, results) => {
  if (err) return console.log(err.message)
  if (results.affectedRows === 1) console.log('插入成功')
})

向表中新增數(shù)據(jù)時,如果數(shù)據(jù)對象的每個屬性和數(shù)據(jù)表的字段一一對應,則可以通過如下方式快速插入數(shù)據(jù):

const user = {username:'Bruce', password:'55520'}
const sql = 'insert into users set ?'
db.query(sql, user, (err, results) => {
  ...
})
  1. 更新數(shù)據(jù)
const sql = 'update users set username=?, password=? where id=?'
db.query(sql, [username, password, id], (err, results) => {
  ...
})

快捷方式:

const user = {id:7,username:'Bruce',password:'55520'}
const sql = 'update users set ? where id=?'
db.query(sql, [user, user.id], (err, results) => {
  ...
})
  1. 刪除數(shù)據(jù)
const sql = 'delete from users where id=?'
db.query(sql, id, (err, results) => {
  ...
})

使用 delete 語句會真正刪除數(shù)據(jù),保險起見,使用標記刪除的形式,模擬刪除的動作。即在表中設置狀態(tài)字段,標記當前的數(shù)據(jù)是否被刪除。

db.query('update users set status=1 where id=?', 7, (err, results) => {
  ...
})

2 Web 開發(fā)模式

2.1 服務端渲染

服務器發(fā)送給客戶端的 HTML 頁面,是在服務器通過字符串的拼接動態(tài)生成的。因此客戶端不需要使用 Ajax 額外請求頁面的數(shù)據(jù)。

app.get('/index.html', (req, res) => {
  const user = { name: 'Bruce', age: 29 }
  const html = `<h1>username:${user.name}, age:${user.age}</h1>`
  res.send(html)
})

優(yōu)點:

  • 前端耗時短。瀏覽器只需直接渲染頁面,無需額外請求數(shù)據(jù)。
  • 有利于 SEO。服務器響應的是完整的 HTML 頁面內(nèi)容,有利于爬蟲爬取信息。

缺點:

  • 占用服務器資源。服務器需要完成頁面內(nèi)容的拼接,若請求比較多,會對服務器造成一定訪問壓力。
  • 不利于前后端分離,開發(fā)效率低。

2.2 前后端分離

前后端分離的開發(fā)模式,依賴于 Ajax 技術的廣泛應用。后端只負責提供 API 接口,前端使用 Ajax 調(diào)用接口。

優(yōu)點:

  • 開發(fā)體驗好。前端專業(yè)頁面開發(fā),后端專注接口開發(fā)。
  • 用戶體驗好。頁面局部刷新,無需重新請求頁面。
  • 減輕服務器的渲染壓力。頁面最終在瀏覽器里生成。

缺點:

  • 不利于 SEO。完整的 HTML 頁面在瀏覽器拼接完成,因此爬蟲無法爬取頁面的有效信息。Vue、React 等框架的 SSR(server side render)技術能解決 SEO 問題。

2.3 如何選擇

  • 企業(yè)級網(wǎng)站,主要功能是展示,沒有復雜交互,且需要良好的 SEO,可考慮服務端渲染
  • 后臺管理項目,交互性強,無需考慮 SEO,可使用前后端分離
  • 為同時兼顧首頁渲染速度和前后端分離開發(fā)效率,可采用首屏服務器端渲染+其他頁面前后端分離的開發(fā)模式

3 身份認證

3.1 Session 認證機制

服務端渲染推薦使用 Session 認證機制

Session 工作原理

高性能服務器Nodejs操作Mysql數(shù)據(jù)庫,front,數(shù)據(jù)庫,服務器,mysql

Express 中使用 Session 認證

  1. 安裝 express-session 中間件
npm install express-session
  1. 配置中間件
const session = require('express-session')
app.use(
  session({
    secret: 'Bruce', // secret 的值為任意字符串
    resave: false,
    saveUninitalized: true,
  })
)
  1. 向 session 中存數(shù)據(jù)

中間件配置成功后,可通過 req.session 訪問 session 對象,存儲用戶信息

app.post('/api/login', (req, res) => {
  req.session.user = req.body
  req.session.isLogin = true

  res.send({ status: 0, msg: 'login done' })
})
  1. 從 session 取數(shù)據(jù)
app.get('/api/username', (req, res) => {
  if (!req.session.isLogin) {
    return res.send({ status: 1, msg: 'fail' })
  }
  res.send({ status: 0, msg: 'success', username: req.session.user.username })
})
  1. 清空 session
app.post('/api/logout', (req, res) => {
  // 清空當前客戶端的session信息
  req.session.destroy()
  res.send({ status: 0, msg: 'logout done' })
})

3.2 JWT 認證機制

前后端分離推薦使用 JWT(JSON Web Token)認證機制,是目前最流行的跨域認證解決方案

JWT 工作原理

Session 認證的局限性:

  • Session 認證機制需要配合 Cookie 才能實現(xiàn)。由于 Cookie 默認不支持跨域訪問,所以,當涉及到前端跨域請求后端接口的時候,需要做很多額外的配置,才能實現(xiàn)跨域 Session 認證。
  • 當前端請求后端接口不存在跨域問題的時候,推薦使用 Session 身份認證機制。
  • 當前端需要跨域請求后端接口的時候,不推薦使用 Session 身份認證機制,推薦使用 JWT 認證機制

JWT 工作原理圖:

用戶的信息通過 Token 字符串的形式,保存在客戶端瀏覽器中。服務器通過還原 Token 字符串的形式來認證用戶的身份。

高性能服務器Nodejs操作Mysql數(shù)據(jù)庫,front,數(shù)據(jù)庫,服務器,mysql

JWT 組成部分:

  • Header、Payload、Signature
  • Payload 是真正的用戶信息,加密后的字符串
  • Header 和 Signature 是安全性相關部分,保證 Token 安全性
  • 三者使用 . 分隔
Header.Payload.Signature

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTcsInVzZXJuYW1lIjoiQnJ1Y2UiLCJwYXNzd29yZCI6IiIsIm5pY2tuYW1lIjoiaGVsbG8iLCJlbWFpbCI6InNjdXRAcXEuY29tIiwidXNlcl9waWMiOiIiLCJpYXQiOjE2NDE4NjU3MzEsImV4cCI6MTY0MTkwMTczMX0.bmqzAkNSZgD8IZxRGGyVlVwGl7EGMtWitvjGD-a5U5c

JWT 使用方式:

  • 客戶端會把 JWT 存儲在 localStorage 或 sessionStorage 中
  • 此后客戶端與服務端通信需要攜帶 JWT 進行身份認證,將 JWT 存在 HTTP 請求頭 Authorization 字段中
  • 加上 Bearer 前綴
Authorization: Bearer <token>

Express 使用 JWT文章來源地址http://www.zghlxwxcb.cn/news/detail-668989.html

  1. 安裝
  • jsonwebtoken 用于生成 JWT 字符串
  • express-jwt 用于將 JWT 字符串解析還原成 JSON 對象
npm install jsonwebtoken express-jwt
  1. 定義 secret 密鑰
  • 為保證 JWT 字符串的安全性,防止其在網(wǎng)絡傳輸過程中被破解,需定義用于加密和解密的 secret 密鑰
  • 生成 JWT 字符串時,使用密鑰加密信息,得到加密好的 JWT 字符串
  • 把 JWT 字符串解析還原成 JSON 對象時,使用密鑰解密
const jwt = require('jsonwebtoken')
const expressJWT = require('express-jwt')

// 密鑰為任意字符串
const secretKey = 'Bruce'
  1. 生成 JWT 字符串
app.post('/api/login', (req, res) => {
  ...
  res.send({
    status: 200,
    message: '登錄成功',
    // jwt.sign() 生成 JWT 字符串
    // 參數(shù):用戶信息對象、加密密鑰、配置對象-token有效期
    // 盡量不保存敏感信息,因此只有用戶名,沒有密碼
    token: jwt.sign({username: userInfo.username}, secretKey, {expiresIn: '10h'})
  })
})
  1. JWT 字符串還原為 JSON 對象
  • 客戶端訪問有權限的接口時,需通過請求頭的 Authorization 字段,將 Token 字符串發(fā)送到服務器進行身份認證
  • 服務器可以通過 express-jwt 中間件將客戶端發(fā)送過來的 Token 解析還原成 JSON 對象
// unless({ path: [/^\/api\//] }) 指定哪些接口無需訪問權限
app.use(expressJWT({ secret: secretKey }).unless({ path: [/^\/api\//] }))
  1. 獲取用戶信息
  • 當 express-jwt 中間件配置成功后,即可在那些有權限的接口中,使用 req.user 對象,來訪問從 JWT 字符串中解析出來的用戶信息
app.get('/admin/getinfo', (req, res) => {
  console.log(req.user)
  res.send({
    status: 200,
    message: '獲取信息成功',
    data: req.user,
  })
})
  1. 捕獲解析 JWT 失敗后產(chǎn)生的錯誤
  • 當使用 express-jwt 解析 Token 字符串時,如果客戶端發(fā)送過來的 Token 字符串過期或不合法,會產(chǎn)生一個解析失敗的錯誤,影響項目的正常運行
  • 通過 Express 的錯誤中間件,捕獲這個錯誤并進行相關的處理
app.use((err, req, res, next) => {
  if (err.name === 'UnauthorizedError') {
    return res.send({ status: 401, message: 'Invalid token' })
  }
  res.send({ status: 500, message: 'Unknown error' })
})

到了這里,關于高性能服務器Nodejs操作Mysql數(shù)據(jù)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 《Linux高性能服務器編程》筆記04

    《Linux高性能服務器編程》筆記04

    本文是讀書筆記,如有侵權,請聯(lián)系刪除。 參考 Linux高性能服務器編程源碼: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服務器編程 I/O復用使得程序能同時監(jiān)聽多個文件描述符,這對提高程序的性能至關重要。通常,網(wǎng)絡程序在下列情況下需要使用I/0復用技術: 客戶

    2024年01月21日
    瀏覽(35)
  • 《Linux高性能服務器編程》筆記02

    《Linux高性能服務器編程》筆記02

    參考 Linux高性能服務器編程源碼: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服務器編程 Linux提供了很多高級的I/O函數(shù)。它們并不像Linux基礎I/O函數(shù)(比如open和read) 那么常用(編寫內(nèi)核模塊時一般要實現(xiàn)這些I/O函數(shù)),但在特定的條件下卻表現(xiàn)出優(yōu)秀的性 能。本章將討論

    2024年01月21日
    瀏覽(28)
  • 【閱讀筆記】Linux 高性能服務器編程

    原文地址以及最新代碼參考:https://github.com/EricPengShuai/Interview/tree/main/Linux Ch.5 Linux 網(wǎng)絡編程基礎 API 5.1 socket 地址 API 5.1.1 主機字節(jié)序和網(wǎng)絡字節(jié)序 大端字節(jié)序(網(wǎng)絡字節(jié)序):高位低地址 小端字節(jié)序(主機字節(jié)序):高位高地址 參考代碼:5-1byteorder.cpp 一般網(wǎng)絡編程中,發(fā)

    2024年02月06日
    瀏覽(43)
  • tomcat---企業(yè)高性能web服務器

    目錄 1.tomcat的簡介 2.tomcat安裝 3.tomcat中重要的目錄及路徑 ?編寫一個tomcat的啟動腳本 4.tomcat的web站點的部署 如果需要修改首頁文件: 5.tomcat的虛擬主機部署 tomcat是一款開源免費的web應用服務器,在中小型企業(yè)及并發(fā)訪問不是很高的情況下使用,是開發(fā)和調(diào)試jsp首選。但是t

    2024年02月13日
    瀏覽(36)
  • 【網(wǎng)絡編程】高性能并發(fā)服務器源碼剖析

    【網(wǎng)絡編程】高性能并發(fā)服務器源碼剖析

    ? hello !大家好呀! 歡迎大家來到我的網(wǎng)絡編程系列之洪水網(wǎng)絡攻擊,在這篇文章中, 你將會學習到在網(wǎng)絡編程中如何搭建一個高性能的并發(fā)服務器,并且我會給出源碼進行剖析,以及手繪UML圖來幫助大家來理解,希望能讓大家更能了解網(wǎng)絡編程技術?。?! 希望這篇文章能

    2024年04月15日
    瀏覽(42)
  • Linux高性能服務器編程——學習筆記①

    Linux高性能服務器編程——學習筆記①

    第一章有一些概念講的很好,值得好好關注一下?。?! 1.1 主要的協(xié)議 1.1.1 數(shù)據(jù)鏈路層 ? 數(shù)據(jù)鏈路層實現(xiàn)了網(wǎng)卡接口的網(wǎng)絡驅(qū)動程序,以處理數(shù)據(jù)在物理媒介(以太網(wǎng)、令牌環(huán))上的傳輸。 ? 常用的協(xié)議有兩種: ARP協(xié)議(Address Resolve Protocol,地址解析協(xié)議) RARP(Reverse

    2024年01月20日
    瀏覽(34)
  • Linux高性能服務器編程——ch10筆記

    信號是由用戶、系統(tǒng)或者進程發(fā)送給目標進程的信息,以通知目標進程某個狀態(tài)的改變或系統(tǒng)異常。 :::tips int kill(pid_t pid, int sig); ::: kill函數(shù):一個進程給其他進程發(fā)送信號的API。 sig一般大于0,如果設為0則表示不發(fā)送信號,可以用來檢測進程或進程組是否存在。由于進程P

    2024年02月06日
    瀏覽(24)
  • 使用CentOS搭建高性能靜態(tài)HTTP服務器

    使用CentOS搭建高性能靜態(tài)HTTP服務器

    在互聯(lián)網(wǎng)應用中,靜態(tài)內(nèi)容是廣泛存在的,例如HTML頁面、圖片、視頻等。為了提供高效、穩(wěn)定和安全的靜態(tài)內(nèi)容服務,我們可以使用CentOS來搭建高性能的靜態(tài)HTTP服務器。 1. 選擇合適的軟件 Nginx和Apache是兩個流行的HTTP服務器軟件。Nginx以其高效、輕量級和快速的性能而著稱,

    2024年01月23日
    瀏覽(19)
  • C++高性能服務器網(wǎng)絡框架設計與實現(xiàn)

    C++高性能服務器網(wǎng)絡框架設計與實現(xiàn)

    這篇文章將從兩個方面來介紹,一個是服務器中的基礎的網(wǎng)絡通信部件;另外一個是,如何利用這些基礎通信部件整合成一個完整的高效的服務器框架。注意:本文以下內(nèi)容中的客戶端是相對概念,指的是連接到當前討論的服務程序的終端,所以這里的客戶端既可能是我們傳

    2024年02月04日
    瀏覽(22)
  • Nginx:高性能的Web服務器與反向代理

    在現(xiàn)代互聯(lián)網(wǎng)應用程序的開發(fā)和部署中,選擇一個可靠、高性能的Web服務器是至關重要的。Nginx是一個備受推崇的選擇,它以其卓越的性能和可靠性在開發(fā)者社區(qū)中享有盛譽。本文將介紹Nginx的概念、優(yōu)勢,以及如何使用Nginx作為Web服務器和反向代理。 Nginx(發(fā)音為“engine X”

    2024年02月19日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包