1. 程式人生 > 實用技巧 >Node.js——部落格系統

Node.js——部落格系統

文章目錄


Node.js——部落格系統

Node.js 的真正用途

  1. Node.js,一個 javascript 的執行環境
  2. 執行在伺服器,作為 web server
  3. 執行在本地,作為打包、構建工具

學習 Node.js 的困惑

  1. Node.js 執行在服務端,而非瀏覽器環境
  2. 服務端開發的思路和套路,與前端完全不一樣

Node.js 安裝

Windows 系統環境安裝 Node.js 參考:https://blog.csdn.net/longestory/article/details/108742759?utm_source=app

MacOS 系統環境安裝 Node.js 參考:
https://blog.csdn.net/longestory/article/details/108742936?utm_source=app

nvm 安裝和管理多版本 Node.js 參考:

https://blog.csdn.net/longestory/article/details/108743099?utm_source=app

在這裡插入圖片描述

node.js 和 javascript 的區別

ECMAScript(定義了語法規範)

javascript(使用 ECMAScript 語法規範,外加 Web API)

node.js(使用 ECMAScript 語法規範,外加 node.js API)


common.js

npm init -y:初始化

debugge:調式

server 開發和前端開發的區別

  • 服務穩定性
  • 考慮記憶體和 CPU (優化,擴充套件)
  • 日誌記錄
  • 安全
  • 叢集和服務拆分

部落格專案介紹

目標

  • 部落格系統,具有部落格的基本功能
  • 只開發 server 端,不關心前端

需求

  • 首頁,作者主頁,部落格詳情頁
  • 登入頁
  • 管理中心,新建頁,編輯頁

技術方案

  • 資料如何儲存(部落格,使用者)
  • 如何與前端對接,即介面設計

開發介面(不用任何框架)

  1. node.js 處理 http 請求
  2. 搭建開發環境
  3. 開發介面

DNS 解析,建立 TCP 連線,傳送 http 請求

server 接收到 http 請求,處理,並返回

客戶端接收到返回資料,處理資料(渲染頁面,執行 js)

get 請求和 querystring

post 請求和 postdata,客戶端要向服務端傳遞資料(postman)(安裝軟體,可以測試請求的資料)

路由

搭建開發環境

使用 nodemon 監測檔案變化,自動重啟 node

使用 cross-env 設定環境變數,相容 mac linux 和 windows

npm i nodemon cross-env --save-dev

開發介面

初始化路由:根據之前技術方案的設計,做出路由

返回假資料:將路由和資料處理分離,以符合設計原則

在這裡插入圖片描述

router:處理路由

controller:處理資料

MySql

mysql 介紹、安裝和使用

  • web server 中最流行的關係型資料庫
  • 官網可免費下載,用於學習
  • 輕量級,易學易用

官網下載地址:
https://dev.mysql.com/downloads/mysql/

workbench

操作 mysql 的客戶端,視覺化操作

下載地址:workdown

操作資料庫

CREATE DATABASE myblog:建立一個名為 myblog 的資料庫

CREATE TABLE users:建立一個名為 users 的表

insert into users (username,password,realname) values ('haha','123456789','哈哈');:插入

select * from users;:查詢所有

select * from users where username='haha' and realname='哈哈';:多條件查詢

select * from users where realnamelike '%哈哈%';:模糊查詢

select * from users where password like '%123%' order by id desc;:查到的結果倒序排列

update users setpassword='123' where username='wuwu';:修改

update blogs set author='xixi' where title='標題B';:修改 author 為 xixi

delete from users where username='haha';:刪除 username 為 haha 的資料

update users set state='0' where username='haha';軟刪除,牢記,修改 username 為 haha 的 state 為 0,

show databases;

node.js 連線 mysql

如果遇到錯誤ER_NOT_SUPPORTED_AUTH_MODE,解決方法:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密碼';(在 mysql 中執行)

錯誤原因:密碼的加密方式

cross-env

npm run dev

API 連線 mysql

保證 server 端的安全性

mysql模組安裝:npm i mysql

登入

核心:登入校驗 & 登入資訊儲存

cookie 和 session

cookie

  • 儲存在瀏覽器的一段字串(最大 5kb)
  • 跨域不共享
  • 格式如 k1=v1;k2=v2;k3=v3; 因此可以儲存結構化資料
  • 每次傳送 http 請求,會將請求域的 cookie 一起傳送給 server
  • server 可以修改 cookie 並返回給瀏覽器
  • 瀏覽器中也可以通過 javascript 修改 cookie(有限制)

客戶端 javascript 操作 cookie

  • 客戶端檢視 cookie,三種方式,開發者工具(Network、Application)、瀏覽器控制檯(document.cookie)
  • javascript 檢視、修改 cookie(有限制)

server 端 node.js 操作 cookie

  • 檢視 cookie
  • 修改 cookie
  • 實現登入驗證

解決亂碼:res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});

cookie 的問題:暴露 username,很危險

解決:cookie 中儲存 userid,server 端對應 username

session,即 server 端儲存使用者資訊

session 寫入 redis

session 的問題:目前 session 直接是 js 變數,放在 node.js 程序記憶體中;程序記憶體有限,訪問量過大,記憶體暴增怎麼解決;正式線上執行是多程序,程序之間記憶體無法共享

redis

  • web server 最常用的快取資料庫,資料存放在記憶體中
  • 相比於 mysql,訪問速度快(記憶體和硬碟不是一個數量級的)
  • 成本更高,可儲存的資料量更小(記憶體的硬傷)

將 web server 和 redis 拆分為兩個單獨的服務

雙方都是獨立的,都是可擴充套件的(例如都擴充套件成叢集)

(包括 mysql,也是一個單獨的服務,也可擴充套件)

session 適用 redis:session 訪問頻繁,對效能要求極高;session 可不考慮斷電丟失資料的問題(記憶體的硬傷);session 資料量不會太大(相比於 mysql 中儲存的資料)

網站資訊不適用 redis:操作頻率不是太高(相比於 session 操作);斷電不能丟失,必須保留;資料量太大,記憶體成本太高

redis 安裝(windows):

操作:cmd 中

redis-server.exe redis.windows.conf:啟動 redis 服務;

視窗不要關,再新開一個 cmd 視窗;redis-cli:登入 redis

redis模組安裝:npm i redis

開發登入功能,和前端聯調(用到 nginx 反向代理)

登入功能依賴 cookie,必須用瀏覽器來聯調

cookie 跨域不共享的,前端和 server 端必須同域

需要用到 nginx 做代理,讓前後端同域

http-server模組安裝:npm i http-server

nginx

  • 高效能的 web 伺服器,開源免費
  • 一般用於做靜態服務負載均衡
  • 反向代理

nginx 下載:官網下載:(穩定版)

nginx 配置 很重要

日誌

系統沒有日誌,就等於人沒有眼睛——抓瞎

第一,訪問日誌 access.log(server 端最重要的日誌)

第二,自定義日誌(包括自定義事件、錯誤記錄等)

node.js 檔案操作,node.js stream

日誌功能開發和使用

日誌檔案拆分,日誌內容分析

IO 操作的效能瓶頸

IO 包括“網路 IO”和“檔案 IO”

相比於 CPU 計算和記憶體讀寫,IO 的突出特點就是:慢

如何在有限的硬體資源下提高 IO 的操作效率?stream

日誌內容會慢慢積累,放在一個檔案中不好處理

按時間劃分日誌檔案,如 2020-10-21.access.log

實現方式,使用 crontab 拆分日誌檔案,使用 readline 分析日誌內容

安全

sql 注入:竊取資料庫內容(解決:escape)

XSS 攻擊:竊取前端的 cookie 內容

密碼加密:保障使用者資訊保安(重要)

express

express 是 node.js 最常用的 web server 框架

如果遇到錯誤about_Execution_Policies,參照