天天看點

從零開始Node.js—15項目實戰項目場景:項目位址:問題記錄:知識點記錄:其他

項目場景:

使用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的類型進行分類,區分人為錯誤還是程式員錯誤。

知識點記錄:

  1. 資料庫對應字段為空,則傳回為js中

    null

  2. 要對使用者發來的資料進行規則驗證,使用

    joi

  3. 使用者發來的代碼不能直接存入庫中,要使用

    bcryptjs

    庫,來對密碼進行加密和驗證
  4. 用于生成token的使用者資訊不能包括使用者密碼和頭像等私密資訊。

其他

  1. 後端建立一個API步驟:配置路由—》設定送出資料的驗證規則—》編寫處理函數
  2. 自定義子產品在引入時,何時采用解構,何時采用對象名.方法,可以适當考慮對象名有沒有表意的功能。

    name

    userInfo.name

    還是後者表意性更強。