最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

nodejs中使用throw進(jìn)行異常處理的操作方法

 更新時間:2024年12月17日 10:40:46   作者:胖虎拽  
最近在寫一個nodejs項目時在思考一個問題: 在方法調(diào)其他方法的過程中,其他方法是采用return來返回特定格式的錯誤數(shù)據(jù)還是使用throw來直接拋出錯誤?所以本文給大家介紹了nodejs中使用throw進(jìn)行異常處理的操作方法,需要的朋友可以參考下

使用return來返回特定格式的錯誤數(shù)據(jù)

用例子來解釋一下,如下代碼所示:

// 一個校驗數(shù)據(jù)的方法(采用return來返回特定格式數(shù)據(jù)的方式)
const validateData = (data) => {
    if (!data.name) {
        return { pass: false, message: '名稱不能為空' }  
    }
}

// 一個提交數(shù)據(jù)的方法,在其中調(diào)用校驗方法
const submit = (data) => {
    const res = validateData(data);
    if (!res.pass) {
        // 提示用戶錯誤信息
        alert(res.message);
    }
}

submit({ name: '' });

在上面的代碼中,validateData方法使用return返回特定格式的數(shù)據(jù),在提交數(shù)據(jù)之前調(diào)用validateData方法校驗數(shù)據(jù),校驗不通過將錯誤信息提示給用戶。

上面這個例子是在前端項目中經(jīng)常會遇到的一種情況,但是在后端項目中,重點并不是提示用戶錯誤信息,而是在接口中以特定格式返回錯誤信息,例如:

// 一個校驗數(shù)據(jù)的方法(采用return來返回特定格式數(shù)據(jù)的方式)
const validateData = (data) => {
    if (!data.name) {
        return { pass: false, message: '名稱不能為空' }  
    }
}

// 一個在數(shù)據(jù)庫表中新增一行數(shù)據(jù)的方法,在其中調(diào)用校驗方法,return返回的數(shù)據(jù)將會作為接口的返回數(shù)據(jù)
const addRow = (data) => {
    const res = validateData(data);
    if (!res.pass) {
        return { code: -1, message: res.message }
    }
    // 數(shù)據(jù)庫中新增數(shù)據(jù)
}

addRow({ name: '' });

在上面的代碼中,通過兩層return來返回數(shù)據(jù);在只有兩層時還好維護(hù)這樣的代碼,但是當(dāng)后端代碼處理的業(yè)務(wù)非常復(fù)雜,方法調(diào)用層級非常深后就會變得難以維護(hù),因為每一層方法都要判斷下一層的返回然后再處理結(jié)構(gòu)后返回給上一層。那我就在想如何更簡單呢?想到了直接使用throw來拋出錯誤。

使用 throw 來拋出錯誤

在后端項目代碼中,主要是處理業(yè)務(wù)邏輯然后將結(jié)果通過接口返回,不像前端項目代碼中有一部分業(yè)務(wù)邏輯還有用戶交互。所以完全可以添加一個中間件,處理代碼中拋出的所有錯誤然后封裝后返回給接口調(diào)用方。例如在nodejs項目中:

// app.js文件
import 'express-async-errors'; // 引入這個模塊后能捕獲未被處理的異步報錯并傳遞給錯誤處理中間件
import express from 'express';
import routes from './routes';
const app = express();
// 一次性掛載所有路由
app.use(routes);
// 全局錯誤處理中間件,所有未捕獲的報錯都在此處理,業(yè)務(wù)代碼專注于業(yè)務(wù)邏輯即可
app.use((error, req, res, next) => {
  // 統(tǒng)一處理所有沒有被捕獲的報錯
  res.status(200).json({ 
      code: -1, 
      message: error?.message || '服務(wù)器錯誤!', 
      data: null 
  });
});


// routes.js文件
import express from 'express';
const router = express.Router();
// 一個校驗數(shù)據(jù)的方法(采用thorw來拋出錯誤的方式)
const validateData = (data) => {
    if (!data.name) {
        throw new Error('名稱不能為空'); 
    }
}
// 一個在數(shù)據(jù)庫表中新增一行數(shù)據(jù)的方法,在其中調(diào)用校驗方法
const addRow = (data) => {
    // 校驗數(shù)據(jù)
    validateData(data);
    // 數(shù)據(jù)庫中新增數(shù)據(jù)
}
// 定義了一個路徑為 /addRow 的路由,調(diào)用了 addRow 方法
router.get('/addRow', (req, res) => {
    addRow({ name: '' });
})

這樣,不論是在多深層級的方法中用throw拋出一個錯誤,只要沒有被捕獲,都能在最外層處理。

為什么要“用throw拋出錯誤然后在全局錯誤處理中間件中處理”這樣去做?

因為在后端業(yè)務(wù)邏輯復(fù)雜的情況下,可能會存在很多層級的代碼調(diào)用,全部使用return來返回特定格式數(shù)據(jù)在編寫和維護(hù)時較為復(fù)雜,而使用throw來拋出后統(tǒng)一處理有這些好處:

  • 統(tǒng)一處理錯誤,讓代碼編寫和維護(hù)變得更簡單

    • 統(tǒng)一處理錯誤:通過throw拋出錯誤并在全局錯誤處理中間件中處理,能夠?qū)⑺蓄愋偷腻e誤(如路由處理中的錯誤、數(shù)據(jù)庫操作錯誤、第三方 API 調(diào)用錯誤等)集中到一個地方進(jìn)行處理;這能夠讓錯誤處理邏輯更加清晰和有條理,避免了錯誤處理零散的分布在各個模塊方法中。
    • 編寫維護(hù)簡單:在深層級的方法中編寫代碼不用考慮錯誤情況下的數(shù)據(jù)返回,直接拋出錯誤即可;所有的錯誤處理邏輯都在一個地方,后續(xù)有錯誤邏輯的更新只需要修改這一個地方即可,便于維護(hù)。
  • 增強程序的穩(wěn)定性

    • 防止程序崩潰:在某個方法或者模塊中發(fā)生錯誤時,如果沒有處理,可能會導(dǎo)致整個程序崩潰;通過全局錯誤處理中間件來處理所有未被捕獲的錯誤,能夠避免單個錯誤引發(fā)的程序崩潰終止。
  • 一致的用戶體驗

    • 統(tǒng)一的錯誤信息數(shù)據(jù)結(jié)構(gòu):在全局錯誤處理中間件中可以統(tǒng)一錯誤信息的數(shù)據(jù)結(jié)構(gòu)后返回給客戶端。這樣客戶端代碼能夠更好的處理錯誤將錯誤展示給用戶。
    • 清晰的錯誤提示:針對一些錯誤碼的報錯,可以將其轉(zhuǎn)化為用戶能夠理解的文字提示后返回給客戶端。

以上就是nodejs中使用throw進(jìn)行異常處理的操作方法的詳細(xì)內(nèi)容,更多關(guān)于node throw異常處理的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Node.js實現(xiàn)RESTful API的示例

    使用Node.js實現(xiàn)RESTful API的示例

    Node.js可以用很少代碼簡單地實現(xiàn)一個Web服務(wù),并且它有一個非?;钴S的社區(qū),通過Node出色的包管理機制(NPM)可以非常容易獲得各種擴展支持。 對簡單的應(yīng)用場景Node.js實現(xiàn)REST是一個非常合適的選擇。 本文介紹如何用Node.js實現(xiàn)REST服務(wù)。
    2017-08-08
  • windows系統(tǒng)中如何更新npm及node.js到最新版本

    windows系統(tǒng)中如何更新npm及node.js到最新版本

    這篇文章主要介紹了windows系統(tǒng)中如何更新npm及node.js到最新版本的相關(guān)資料,文中介紹了兩種方法,還提到了一些常見問題的解決方法,如權(quán)限錯誤和使用nvm-windows管理Node.js版本,需要的朋友可以參考下
    2025-05-05
  • nodejs抓取notion?emoji?svg資源的腳本示例

    nodejs抓取notion?emoji?svg資源的腳本示例

    這篇文章主要為大家介紹了nodejs抓取notion?emoji?svg資源腳本實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 干凈卸載Windows的Node.js環(huán)境的方法

    干凈卸載Windows的Node.js環(huán)境的方法

    這篇文章主要介紹了如何干凈卸載Windows的Node.js環(huán)境的方法,文中通過圖文結(jié)合的方式講解的非常詳細(xì),對大家刪除Node.js環(huán)境有一定的幫助,需要的朋友可以參考下
    2025-01-01
  • 淺談Node.js爬蟲之網(wǎng)頁請求模塊

    淺談Node.js爬蟲之網(wǎng)頁請求模塊

    本篇文章主要介紹了淺談Node.js爬蟲之網(wǎng)頁請求模塊,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 了不起的node.js讀書筆記之node.js中的特性

    了不起的node.js讀書筆記之node.js中的特性

    這篇文章主要介紹了了不起的node.js讀書筆記之node.js中的特性,需要的朋友可以參考下
    2014-12-12
  • Node Puppeteer圖像識別實現(xiàn)百度指數(shù)爬蟲的示例

    Node Puppeteer圖像識別實現(xiàn)百度指數(shù)爬蟲的示例

    本篇文章主要介紹了Node Puppeteer圖像識別實現(xiàn)百度指數(shù)爬蟲的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • 前端必會的輕量打包工具gulp使用詳解

    前端必會的輕量打包工具gulp使用詳解

    這篇文章主要為大家介紹了前端必會的輕量打包工具gulp使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • nodejs處理圖片的幾種方法總結(jié)(使用sharp、jimp及webconvert)

    nodejs處理圖片的幾種方法總結(jié)(使用sharp、jimp及webconvert)

    這篇文章主要給大家介紹了關(guān)于nodejs處理圖片的幾種方法,文中介紹的方法分別是sharp、jimp及webconvert,在開發(fā)過程中我們有時候需要對圖片進(jìn)行處理,給一個圖片添加水印、多個圖片合成為一圖片等操作,需要的朋友可以參考下
    2023-12-12
  • 如何用Node寫頁面爬蟲的工具集

    如何用Node寫頁面爬蟲的工具集

    這篇文章主要介紹了如何用Node寫頁面爬蟲的工具集,主要介紹了三種方法,分別是Puppeteer、cheerio和Auto.js,感興趣的小伙伴們可以參考一下
    2018-10-10

最新評論

榆树市| 姚安县| 铅山县| 鄂托克前旗| 开平市| 新巴尔虎右旗| 育儿| 大邑县| 寻甸| 垫江县| 汪清县| 固阳县| 灵宝市| 军事| 彩票| 峨眉山市| 吕梁市| 曲沃县| 河北区| 张北县| 金坛市| 科技| 治多县| 康马县| 宁乡县| 广昌县| 锡林浩特市| 新郑市| 杂多县| 陆丰市| 仪征市| 金平| 汉寿县| 葵青区| 商南县| 桐庐县| 马龙县| 图们市| 新龙县| 伊吾县| 宜阳县|