国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

5 種高級(jí) NodeJS 技術(shù)

這篇具有很好參考價(jià)值的文章主要介紹了5 種高級(jí) NodeJS 技術(shù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

作為開發(fā)人員,我們都致力于打造高效、健壯且易于理解、修改和擴(kuò)展的代碼庫(kù)。通過采用最佳實(shí)踐和探索先進(jìn)技術(shù),我們可以釋放 NodeJS 的真正潛力并顯著提高應(yīng)用程序的質(zhì)量。在這篇文章中,我們將重點(diǎn)介紹 NodeJS 的五種高級(jí)技術(shù)。所以,系好安全帶,我們要開車了,準(zhǔn)備好探索它們吧。

1.添加中間件

不要將中間件添加到每個(gè)路由,而是使用 use 方法將其添加到路由列表的頂部。這樣,中間件下面定義的任何路由都會(huì)在到達(dá)各自的路由處理程序之前自動(dòng)通過中間件。



const route = express.Router();
const {login} = require("../controllers/auth");


route.get('/login', login)


// isAuthenticated is middleware that checks whether 
// you are authenticated or not
// // ? Avoid this: middleware on each route
route.get('/products', isAuthenticated, fetchAllProducts);
route.get('/product/:id', isAuthenticated, getProductById)



// ? Instead, do this
// Route without middleware
route.get('/login', login)


// Middleware function: isAuthenticated
// This will be applied to all routes defined after this point
route.use(isAuthenticated);


// Routes that will automatically check the middleware
route.get('/products', fetchAllProducts);
route.get('/product/:id', getProductById);

這種方法有助于保持代碼的組織性,并避免為每個(gè)路由單獨(dú)重復(fù)中間件。

2.使用全局錯(cuò)誤處理

我們可以使用 NodeJS 全局錯(cuò)誤處理功能,而不是在每個(gè)控制器上構(gòu)建錯(cuò)誤響應(yīng)。首先,創(chuàng)建一個(gè)派生自內(nèi)置 Error 類的自定義 AppError 類。此自定義類允許您使用 statusCode 和 status 等附加屬性來自定義錯(cuò)誤對(duì)象

// Custom Error class
module.exports = class AppError extends Error {
  constructor(message, statusCode) {
    super(message);
    this.statusCode = statusCode;
    this.status = statusCode < 500 ? "error" : "fail";


    Error.captureStackTrace(this, this.constructor);
  }
};

創(chuàng)建自定義錯(cuò)誤類后,請(qǐng)?jiān)诟酚善魑募刑砑尤皱e(cuò)誤處理程序中間件。該中間件函數(shù)采用四個(gè)參數(shù)(err、req、res、next)并處理整個(gè)應(yīng)用程序中的錯(cuò)誤。

在全局錯(cuò)誤處理程序中,您可以根據(jù)錯(cuò)誤對(duì)象的 statusCode、status 和 message 屬性來格式化錯(cuò)誤響應(yīng)。

您可以自定義此響應(yīng)格式以滿足您的需求。此外,還包括用于開發(fā)環(huán)境的堆棧屬性。

// Express setup
const express = require('express');


const app = express();


app.use('/', (req, res) => {
  res.status(200).json({ message: "it works" });
});


app.use('*', (req, res) => {
    res.status(404).json({
        message: `Can't find ${req.originalUrl} this route`,
    });
});


// ?? add a global error handler after all the routes.
app.use((err, req, res, next) => {
  err.status = err.status || "fail";
  err.statusCode = err.statusCode || 500;


  res.status(err.statusCode).json({
    status: err.status,
    message: transformMessage(err.message),
    stack: process.env.NODE_ENV === "development" ? err.stack : undefined,
  });
});

添加后,您可以使用 next(new AppError(message, statusCode)) 拋出錯(cuò)誤。下一個(gè)函數(shù)會(huì)自動(dòng)將錯(cuò)誤傳遞給全局錯(cuò)誤處理程序中間件。

// inside controllers


// route.get('/login', login);


exports.login = async (req, res, next) => {
  try {
    const { email, password } = req.body;


    const user = await User.findOne({ email }).select("+password +lastLoginAt");


    if (!user || !(await user.correctPassword(password, user.password))) {
      // ?? like this
      return next(new AppError("Invalid Email / Password / Method", 404));
    }


     // Custom logic for generating a token
    const token = 'generated_token';


    res.status(200).json({ token });
  } catch(error) {
      next(error
  }
});

總體而言,這種方法通過將錯(cuò)誤處理集中在一個(gè)位置來簡(jiǎn)化錯(cuò)誤處理,從而更輕松地在應(yīng)用程序中維護(hù)和自定義錯(cuò)誤響應(yīng)。

3.使用自定義Try-Catch函數(shù)

我們可以使用實(shí)現(xiàn)相同目的的自定義函數(shù),而不是使用 try-catch 塊手動(dòng)包裝每個(gè)控制器函數(shù)。

// ? Avoid this
// Using try-catch block each controllers
exports.login = async (req, res, next) => {
  try {
    // logic here
  } catch(error) {
      res.status(400).json({ message: 'You error message'}
  }
});

tryCatchFn 函數(shù)接受函數(shù) (fn) 作為輸入,并返回一個(gè)用 try-catch 塊包裝原始函數(shù)的新函數(shù)。

如果在包裝函數(shù)內(nèi)發(fā)生錯(cuò)誤,則使用 catch 方法捕獲錯(cuò)誤,并將錯(cuò)誤傳遞到下一個(gè)函數(shù)以由全局錯(cuò)誤處理程序處理。

// ? Instead, do this
const tryCatchFn = (fn) => {
  return (req, res, next) => {
    fn(req, res, next).catch(next);
  };
}


// To use this custom function, you can wrap your controller 
// functions with tryCatchFn:
exports.login = tryCatchFn(async (req, res, next) => {
  // logic here
});

通過使用 tryCatchFn 包裝控制器函數(shù),您可以確保自動(dòng)捕獲這些函數(shù)中引發(fā)的任何錯(cuò)誤并將其傳遞給全局錯(cuò)誤處理程序,從而無需單獨(dú)添加 try-catch 塊。

這種方法有助于以更清晰、更簡(jiǎn)潔的方式集中錯(cuò)誤處理,使代碼更易于維護(hù)并減少重復(fù)的錯(cuò)誤處理代碼。

4. 將主文件分成兩部分。

使用 Express 開發(fā) NodeJS 應(yīng)用程序時(shí),通常有一個(gè)包含所有業(yè)務(wù)邏輯、路由定義和服務(wù)器設(shè)置的主文件。

然而,隨著應(yīng)用程序的增長(zhǎng),管理和維護(hù)處理所有事情的單個(gè)文件可能會(huì)變得困難。

解決此問題并保持代碼庫(kù)更干凈、更有條理的一種推薦技術(shù)是將主文件分為兩部分:一個(gè)用于路由,另一個(gè)用于服務(wù)器設(shè)置或配置。

這是一個(gè)例子:

// app.js
const express = require('express');
const app = express();


/* Middlewares */


app.get('/', (req, res) => {
  res.status(200).json({ message: "it works" });
})


app.use(/* Global Error Handler */);
module.exports = app;


// server.js
const app = require('./app');
const port = process.env.PORT || 5001;


app.listen(port, () => console.log('Server running at', port));

5. 將路由與控制器分開

為了實(shí)現(xiàn)更有組織性和模塊化的代碼庫(kù),我建議將路由與控制器分開。這種做法有助于保持清晰的關(guān)注點(diǎn)分離,并提高代碼的可讀性和可維護(hù)性。

這是一個(gè)演示路由和控制器分離的示例。

// ? Avoid this
const route = express.Router();


route.get('/login', tryCatchFn(req, res, next) => {
  // logic here
}))


// ? Do this
const route = express.Router();
const {login} = require("../controllers/auth");


route.get('/login', login);

結(jié)論

在本文中,我們討論了編寫干凈且易于維護(hù)的 NodeJS 代碼的不同高級(jí)技術(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-701275.html

到了這里,關(guān)于5 種高級(jí) NodeJS 技術(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Nodejs】Node.js簡(jiǎn)介

    【Nodejs】Node.js簡(jiǎn)介

    Node 的重要性已經(jīng)不言而喻,很多互聯(lián)網(wǎng)公司都已經(jīng)有大量的高性能系統(tǒng)運(yùn)行在 Node 之上。Node 憑借其單線程、異步等舉措實(shí)現(xiàn)了極高的性能基準(zhǔn)。此外,目前最為流行的 Web 開發(fā)模式是前后端分離的形式,即前端開發(fā)者與后端開發(fā)者在自己喜歡的 IDE 上獨(dú)立進(jìn)行開發(fā),然后通

    2024年02月12日
    瀏覽(33)
  • 5 種高級(jí) NodeJS 技術(shù)

    作為開發(fā)人員,我們都致力于打造高效、健壯且易于理解、修改和擴(kuò)展的代碼庫(kù)。通過采用最佳實(shí)踐和探索先進(jìn)技術(shù),我們可以釋放 NodeJS 的真正潛力并顯著提高應(yīng)用程序的質(zhì)量。在這篇文章中,我們將重點(diǎn)介紹 NodeJS 的五種高級(jí)技術(shù)。所以,系好安全帶,我們要開車了,準(zhǔn)備

    2024年02月09日
    瀏覽(19)
  • 淺談 Node.js 與快速入門使用——前端開發(fā)工程師必須要知道的技術(shù)(文末送書福利6.0)

    淺談 Node.js 與快速入門使用——前端開發(fā)工程師必須要知道的技術(shù)(文末送書福利6.0)

    當(dāng)下,各行各業(yè)都面臨著大數(shù)據(jù)、人工智能、AR(augmented reality,增強(qiáng)現(xiàn)實(shí))、VR(virtual reality,虛擬現(xiàn)實(shí))等各種互聯(lián)網(wǎng)新技術(shù)的沖擊。在此技術(shù)背景下,Web前端行業(yè)也發(fā)生了巨大的改變,前端程序員已從單純的切圖處理發(fā)展到了需要處理多種后端業(yè)務(wù)。其中,Node.js 就是連

    2024年02月09日
    瀏覽(36)
  • 【Nodejs】Node.js開發(fā)環(huán)境安裝

    【Nodejs】Node.js開發(fā)環(huán)境安裝

    在命令窗口中輸入 node -v 可以查看版本 0.x 完全不技術(shù) ES6 4.x 部分支持 ES6 特性 5.x 部分支持ES6特性(比4.x多些),屬于過渡產(chǎn)品,現(xiàn)在來說應(yīng)該沒有什么理由去用這個(gè)了 6.x 支持98%的 ES6 特性 8.x 支持 ES6 特性 去 Node.js 的官網(wǎng)下載安裝包: 我們也可以下載歷史版本。 后續(xù)如果

    2024年02月15日
    瀏覽(36)
  • Node.Js篇 NodeJs使用MongoDB

    Node.Js篇 NodeJs使用MongoDB

    目錄 介紹 概念解析 ??????????????????安裝 啟動(dòng)時(shí)注意事項(xiàng) NodeJs操作Mongo 介紹 MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語言編寫。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    2024年02月09日
    瀏覽(31)
  • 【nodejs】用Node.js實(shí)現(xiàn)簡(jiǎn)單的壁紙網(wǎng)站爬蟲

    【nodejs】用Node.js實(shí)現(xiàn)簡(jiǎn)單的壁紙網(wǎng)站爬蟲

    在這個(gè)博客中,我們將學(xué)習(xí)如何使用Node.js編寫一個(gè)簡(jiǎn)單的爬蟲來從壁紙網(wǎng)站獲取圖片并將其下載到本地。我們將使用Axios和Cheerio庫(kù)來處理HTTP請(qǐng)求和HTML解析。 首先,確保你已經(jīng)安裝了Node.js環(huán)境。然后,我們將創(chuàng)建一個(gè)新的文件夾,初始化項(xiàng)目并安裝所需的依賴庫(kù): 編寫爬蟲

    2024年02月12日
    瀏覽(28)
  • 「NodeJs進(jìn)階」超全面的 Node.js 性能優(yōu)化相關(guān)知識(shí)梳理

    「NodeJs進(jìn)階」超全面的 Node.js 性能優(yōu)化相關(guān)知識(shí)梳理

    相信對(duì)于前端同學(xué)而言,我們?nèi)ラ_發(fā)一個(gè)自己的簡(jiǎn)單后端程序可以借助很多的nodeJs的框架去進(jìn)行快速搭建,但是從前端面向后端之后,我們會(huì)在很多方面會(huì)稍顯的有些陌生,比如「性能分析」,「性能測(cè)試」,「內(nèi)存管理」,「內(nèi)存查看」,「使用C++插件」,「子進(jìn)程」,「

    2024年02月01日
    瀏覽(26)
  • web前端開發(fā)——期末大作業(yè)網(wǎng)頁(yè)制作——web網(wǎng)頁(yè)設(shè)計(jì)期末課程大作業(yè) HTML+CSS+JS網(wǎng)頁(yè)設(shè)計(jì)期末課程大作業(yè) web前端開發(fā)技術(shù) web課程設(shè)計(jì) 網(wǎng)頁(yè)規(guī)劃與設(shè)計(jì)

    web前端開發(fā)——期末大作業(yè)網(wǎng)頁(yè)制作——web網(wǎng)頁(yè)設(shè)計(jì)期末課程大作業(yè) HTML+CSS+JS網(wǎng)頁(yè)設(shè)計(jì)期末課程大作業(yè) web前端開發(fā)技術(shù) web課程設(shè)計(jì) 網(wǎng)頁(yè)規(guī)劃與設(shè)計(jì)

    HTML實(shí)例網(wǎng)頁(yè)代碼, 本實(shí)例適合于初學(xué)HTML的同學(xué)。該實(shí)例里面有設(shè)置了css的樣式設(shè)置,有div的樣式格局,這個(gè)實(shí)例比較全面,有助于同學(xué)的學(xué)習(xí),本文將介紹如何通過從頭開始設(shè)計(jì)個(gè)人網(wǎng)站并將其轉(zhuǎn)換為代碼的過程來實(shí)踐設(shè)計(jì)。 ?精彩專欄推薦???????????? ? 【作者主頁(yè)

    2024年02月09日
    瀏覽(29)
  • Nodejs 入門8 NeDB 輕量級(jí)的Node.js 數(shù)據(jù)庫(kù)

    Nodejs 入門8 NeDB 輕量級(jí)的Node.js 數(shù)據(jù)庫(kù)

    常用的sqlite輕量級(jí)數(shù)據(jù)庫(kù),nodejs在windows環(huán)境下安裝配置有時(shí)候會(huì)比較麻煩,很難順利安裝。 Nedb(Node Embedded Database)在一些情況下可以替代sqlite,特別適用于小型項(xiàng)目和快速原型開發(fā)。本文將介紹Nedb的基本概念、特性和使用方法,以幫助大家更好地了解和利用這個(gè)便捷的工

    2024年01月22日
    瀏覽(30)
  • 【Node.js從基礎(chǔ)到高級(jí)運(yùn)用】二十五、Node.js中Cluster的作用

    【Node.js從基礎(chǔ)到高級(jí)運(yùn)用】二十五、Node.js中Cluster的作用

    Node.js中的 cluster 模塊允許您輕松創(chuàng)建共享服務(wù)器端口的子進(jìn)程。這是一個(gè)核心模塊,用于在Node.js應(yīng)用程序中實(shí)現(xiàn)多進(jìn)程架構(gòu),以充分利用多核CPU系統(tǒng)的計(jì)算能力。 當(dāng)您啟動(dòng)一個(gè)Node.js應(yīng)用程序時(shí),默認(rèn)情況下它運(yùn)行在單個(gè)進(jìn)程中。對(duì)于多核CPU系統(tǒng)來說,這意味著您可能沒有充

    2024年04月22日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包