Node.js——部落格系統
文章目錄
Node.js——部落格系統
Node.js 的真正用途
- Node.js,一個 javascript 的執行環境
- 執行在伺服器,作為 web server
- 執行在本地,作為打包、構建工具
學習 Node.js 的困惑
- Node.js 執行在服務端,而非瀏覽器環境
- 服務端開發的思路和套路,與前端完全不一樣
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 參考:
node.js 和 javascript 的區別
ECMAScript(定義了語法規範)
javascript(使用 ECMAScript 語法規範,外加 Web API)
node.js(使用 ECMAScript 語法規範,外加 node.js API)
common.js
npm init -y
:初始化
debugge:調式
server 開發和前端開發的區別
- 服務穩定性
- 考慮記憶體和 CPU (優化,擴充套件)
- 日誌記錄
- 安全
- 叢集和服務拆分
部落格專案介紹
目標
- 部落格系統,具有部落格的基本功能
- 只開發 server 端,不關心前端
需求
- 首頁,作者主頁,部落格詳情頁
- 登入頁
- 管理中心,新建頁,編輯頁
技術方案
- 資料如何儲存(部落格,使用者)
- 如何與前端對接,即介面設計
開發介面(不用任何框架)
- node.js 處理 http 請求
- 搭建開發環境
- 開發介面
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 set
password='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
,參照