五种高级 NodeJS 技术

简介: 五种高级 NodeJS 技术

作为开发人员,我们都致力于打造高效、健壮且易于理解、修改和扩展的代码库。 通过采用最佳实践和探索先进技术,我们可以释放 NodeJS 的真正潜力并显着提高应用程序的质量。 在这篇文章中,我们将重点介绍 NodeJS 的五种高级技术。 所以,系好安全带,我们要开车了,准备好探索它们吧。

image.jpeg

1. 添加中间件



不要将中间件添加到每个路由,而是使用 use 方法将其添加到路由列表的顶部。 这样,中间件下面定义的任何路由都会在到达各自的路由处理程序之前自动通过中间件。

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);

这种方法有助于保持代码的组织性,并避免为每个路由单独重复中间件。


2. 使用全局错误处理



我们可以使用 NodeJS 全局错误处理功能,而不是在每个控制器上构建错误响应。 首先,创建一个派生自内置 Error 类的自定义 AppError 类。 此自定义类允许您使用 statusCode 和 status 等附加属性来自定义错误对象。

// 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);
  }
};


创建自定义错误类后,请在根路由器文件中添加全局错误处理程序中间件。 该中间件函数采用四个参数(err、req、res、next)并处理整个应用程序中的错误。


在全局错误处理程序中,您可以根据错误对象的 statusCode、status 和 message 属性来格式化错误响应。


您可以自定义此响应格式以满足您的需求。 此外,还包括用于开发环境的堆栈属性。

// 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)) 抛出错误。 下一个函数会自动将错误传递给全局错误处理程序中间件。

// 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
  }
});


总体而言,这种方法通过将错误处理集中在一个位置来简化错误处理,从而更轻松地在应用程序中维护和自定义错误响应。


3. 使用自定义Try-Catch函数



我们可以使用实现相同目的的自定义函数,而不是使用 try-catch 块手动包装每个控制器函数。

// ❌ 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 函数接受函数 (fn) 作为输入,并返回一个用 try-catch 块包装原始函数的新函数。


如果在包装函数内发生错误,则使用 catch 方法捕获错误,并将错误传递到下一个函数以由全局错误处理程序处理。


// ✅ 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 包装控制器函数,您可以确保自动捕获这些函数中引发的任何错误并将其传递给全局错误处理程序,从而无需单独添加 try-catch 块。


这种方法有助于以更清晰、更简洁的方式集中错误处理,使代码更易于维护并减少重复的错误处理代码。


4. 将主文件分成两部分



使用 Express 开发 NodeJS 应用程序时,通常有一个包含所有业务逻辑、路由定义和服务器设置的主文件。


然而,随着应用程序的增长,管理和维护处理所有事情的单个文件可能会变得困难。


解决此问题并保持代码库更干净、更有条理的一种推荐技术是将主文件分为两部分:一个用于路由,另一个用于服务器设置或配置。


这是一个例子:

// 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. 将路由与控制器分开



为了实现更有组织性和模块化的代码库,我建议将路由与控制器分开。 这种做法有助于保持清晰的关注点分离,并提高代码的可读性和可维护性。

 

这是一个演示路由和控制器分离的示例。

// ❌ 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);


结论



在本文中,我们讨论了编写干净且易于维护的 NodeJS 代码的不同高级技术。有许多最佳实践可以显着提高应用程序代码的质量。


文末介绍一个能提高开发效率的软件开发平台,JNPF开发平台是一组数字技术工具,能基于图形化拖拽、参数化配置等更为高效的方式,实现快速构建、数据编排、连接生态、中台服务等。通过少量代码或不用代码实现数字化转型中的场景应用创新。它能缓解甚至解决庞大的市场需求与传统的开发生产力引发的供需关系矛盾问题,是数字化转型过程中降本增效趋势下的产物。


采用的是最新主流前后分离框架(SpringBoot+Mybatis-plus+Ant-Design+Vue3)。代码生成器依赖性低,灵活的扩展能力,可灵活实现二次开发。项目地址:https://www.jnpfsoft.com/?csdn


有了它,开发人员在开发过程中就可以轻松上手,充分利用传统开发模式下积累的经验。所以低代码平台对于程序员来说,有着很大帮助。


相关文章
|
2月前
|
Web App开发 JavaScript 前端开发
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念
Node.js 是一种基于 Chrome V8 引擎的后端开发技术,以其高效、灵活著称。本文将介绍 Node.js 的基础概念,包括事件驱动、单线程模型和模块系统;探讨其安装配置、核心模块使用、实战应用如搭建 Web 服务器、文件操作及实时通信;分析项目结构与开发流程,讨论其优势与挑战,并通过案例展示 Node.js 在实际项目中的应用,旨在帮助开发者更好地掌握这一强大工具。
56 1
|
3月前
|
JavaScript 前端开发 中间件
探索后端技术:Node.js与Express框架的完美融合
【10月更文挑战第7天】 在当今数字化时代,Web应用已成为日常生活不可或缺的一部分。本文将深入探讨后端技术的两大重要角色——Node.js和Express框架,分析它们如何通过其独特的特性和优势,为现代Web开发提供强大支持。我们将从Node.js的非阻塞I/O和事件驱动机制,到Express框架的简洁路由和中间件特性,全面解析它们的工作原理及应用场景。此外,本文还将分享一些实际开发中的小技巧,帮助你更有效地利用这些技术构建高效、可扩展的Web应用。无论你是刚入门的新手,还是经验丰富的开发者,相信这篇文章都能为你带来新的启发和思考。
|
3月前
|
JavaScript 前端开发 API
探索后端技术:Node.js的优势和实际应用
【10月更文挑战第6天】 在当今数字化时代,后端开发是任何成功软件应用的关键组成部分。本文将深入探讨一种流行的后端技术——Node.js,通过分析其核心优势和实际应用案例,揭示其在现代软件开发中的重要性和潜力。
226 2
|
2月前
|
JavaScript 前端开发 中间件
JS服务端技术—Node.js知识点
本文介绍了Node.js中的几个重要模块,包括NPM、Buffer、fs模块、path模块、express模块、http模块以及mysql模块。每部分不仅提供了基础概念,还推荐了相关博文供深入学习。特别强调了express模块的使用,包括响应相关函数、中间件、Router和请求体数据解析等内容。文章还讨论了静态资源无法访问的问题及其解决方案,并总结了一些通用设置。适合Node.js初学者参考学习。
51 1
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的图像识别技术深入理解Node.js事件循环及其在后端开发中的应用
【8月更文挑战第27天】本文将介绍深度学习中的图像识别技术,包括其原理、应用领域及未来发展。我们将探讨如何通过神经网络实现图像识别,并分析其在医疗、交通等领域的应用。最后,我们将展望图像识别技术的发展前景。
|
5月前
|
运维 Cloud Native JavaScript
云端新纪元:云原生技术深度解析深入理解Node.js事件循环及其在异步编程中的应用
【8月更文挑战第27天】随着云计算技术的飞速发展,云原生已成为推动现代软件开发和运维的关键力量。本文将深入探讨云原生的基本概念、核心价值及其在实际业务中的应用,帮助读者理解云原生如何重塑IT架构,提升企业的创新能力和市场竞争力。通过具体案例分析,我们将揭示云原生技术背后的哲学思想,以及它如何影响企业决策和操作模式。
|
5月前
|
数据采集 存储 编解码
简略nodejs爬取网站内容技术
互联网公开信息可通过数据爬取获取,常用Python实现。利用URL以HTTP形式抓取数据,需登录验证时使用token或账号密码。针对HTML页面,从DOM提取所需内容。Python与Node.js均有丰富库支持爬虫开发。如Node.js下的Axios用于请求数据,iconv-lite处理非UTF-8编码,Cheerio则解析HTML节点。基本流程包括:按规则请求HTTP内容,处理返回数据,并存储解析结果。
|
7月前
|
数据采集 存储 编解码
技术笔记:Node.jsmm131图片批量下载爬虫1.01增加断点续传功能
技术笔记:Node.jsmm131图片批量下载爬虫1.01增加断点续传功能
117 0
|
7月前
|
JavaScript 前端开发 Ubuntu
技术心得:怎么卸载nodejs?
技术心得:怎么卸载nodejs?
570 0
|
7月前
|
Web App开发 JavaScript 前端开发
技术心得:完全卸载node
技术心得:完全卸载node
1178 0