項目場景:
使用Express搭建一個Node伺服器,實作如下功能
- 使用者注冊、登入
- 使用者個人資訊更改
- 文章類别增删改查
- 文章增删改查
項目位址:
node-express-event
問題記錄:
1 多異步處理
浏覽器請求獲得文章清單和文章總數。需要分兩次對資料庫進行查詢,都查到之後将資料拼起來給客浏覽器。
對資料庫增删改查通過db.query異步實作,若兩次操作存在依賴關系,函數嵌套行為情有可原。
但是若不存在依賴關系,還寫成串行,則沒有利用好異步I/O帶來的并行優勢。
bad ↓
// 串行查找,未利用好異步I/O優勢
db.query(countSql, (err, results) => {
if (err) return res.cc(err);
if (results.length !== 1) return res.cc("錯誤");
const total = results[0].total;
db.query(selectSql, (err, data) => {
if (err) return res.cc(err);
return res.send({
status: 0,
message: "擷取文章清單成功!",
data,
total,
});
});
});
解決方法:引入函數done,當函數的執行次數等于異步資料,則傳回響應
good↓
// 并行查找,都查找完一同傳回
let count = 0;
let results = {};
const done = (key, value) => {
results[key] = value;
count++;
if (count === 2) {
return res.send({
status: 0,
message: "擷取文章清單成功!",
data: results.data,
total: results.total,
});
}
};
db.query(countSql, (err, results) => {
if (err) return res.cc(err);
if (results.length !== 1) return res.cc("錯誤");
done("total", results[0].total);
});
db.query(selectSql, (err, data) => {
if (err) return res.cc(err);
done("data", data);
2 傳回響應,然後呢?
res.send()
服務端傳回給前端資料,但是程式還會繼續執行,直到遇到return。
是以代碼一般簡寫為:
return res.send()
3 區分抛出的錯誤類型
錯誤中間件可以捕獲異常,這樣就不會引起線程退出。
錯誤中間件中有必要對error的類型進行分類,區分人為錯誤還是程式員錯誤。
知識點記錄:
- 資料庫對應字段為空,則傳回為js中
null
- 要對使用者發來的資料進行規則驗證,使用
庫joi
- 使用者發來的代碼不能直接存入庫中,要使用
庫,來對密碼進行加密和驗證bcryptjs
- 用于生成token的使用者資訊不能包括使用者密碼和頭像等私密資訊。
其他
- 後端建立一個API步驟:配置路由—》設定送出資料的驗證規則—》編寫處理函數
- 自定義子產品在引入時,何時采用解構,何時采用對象名.方法,可以适當考慮對象名有沒有表意的功能。
和name
還是後者表意性更強。userInfo.name