盘点那些不可错过的Node.js后端框架

发表时间: 2024-06-07 17:04

导读:Node.js以亲民,容易学习且功能强大而“俘获”很多开发者,特别是基于其上的一些应用框架也不断产生,本文为你总结和推荐 5 款流行且实用的“好东西”。

自打 2009 年以来,Node.js 成为开发者们特别是前端人员热议的话题,还有一部分萌新的后端开发者也都开始使用 Node.js,开发网站和相关应用程序。

从流行榜上来看,在过去几年,它的受欢迎程度确实正在不断提升。

它在北美称为受欢迎的Web开发工具,包括Netflix和PayPal等大型互联网客户。

受欢迎程度上升的原因是加载时间的减少和性能的提高。因此,我们分析 2024 年排名前 5 的 Node.js 后端框架是一件重要的事情。

因此,本文将为各位介绍 2024 年排名前 5 的 Node.js 后端框架、它们的功能和常见用例。

Express.js:经过测评的“冠军”

Express.js 是 Node.js 著名的后端框架之一。

它是一个开源 Web 应用程序框架,可供开发者们免费使用,它亦基于 Node.js 平台构建。Express.js 是一个极简框架,新手和经验丰富的 Web 开发人员都能很快入门并实践。

目前它的场景主要用于创建 Web 应用程序与 RESTful API。

是什么让它脱颖而出?我们现在总结如下:

1.高效的路由

Express.js 提供了一种简洁的方法来管理各种 HTTP 请求并将它们分配给特定任务。

让我们来看一个代码例子:

// app.js const express = require('express'); const app = express(); const port = 3000; // 主页的路由app.get('/', (req, res) => {   res.send('欢迎来到主页!'); }); // 路由 2 app.get('/user/:id', (req, res) => {   const userId = req.params.id;   res.send(用户资料页面 - ID: ${userId} ); });

2.中间件支持

Express.js 允许中间件支持处理 HTTP 请求。让我们看一个创建用于记录 HTTP 请求详细信息中间件的简单示例。

const express = require('express'); const app = express(); const port = 3000; app.use((req, res, next) => {   console.log([${new Date().toLocaleString()}] ${req.method} ${req.url} );   next(); });

3. 轻松数据库集成

Express.js 与数据库无关,也就是它不强制使用特定的数据库,开发者们可以选择自己喜欢的数据库。

Express.js 之所以容易集成数据库,主要是因为它的模块化、灵活性还有提供数据库连接和丰富的 npm 包生态系统。

4. 易于学习

Express.js 在业界中以简单和简约的设计而闻名,这使得我们很容易学习,特别是已经熟悉 JavaScript 和 Node.js的同学。

此外,我们还可以使用Bit等工具轻松开始使用 Express.js ,Bit是可组合软件的下一代构建系统。

再仔细考虑,我们会发现 Express.js 本身就是可组合的。你可以在应用程序的任何位置插入和播放组件。

例如,我们可以创建可以在任何给定时间插拔的中间件组件。

图: 使用 Bit 和独立组件设计的 Express API 的Bit Scope

我们可以看到两个组件:授权者和 API 应用。这两个组件已作为独立的 Bit 组件实现,并在其独立空间中进行维护以及版本控制。

通过这样实现,我们可以快速地以可组合的方式设计自己的应用程序!

NestJS:带给我们一种现代且结构化的开发方法

NestJS 是一个以构建可扩展且高效的 Node.js 服务器端应用程序而闻名的框架。

Nest 使用渐进式 JavaScript,也具有用 TypeScript 编写代码的能力。尽管它完全支持 Typescript,但它可以用纯 JavaScript 编写代码,并包括面向对象编程函数式编程和函数式反应式编程。

主要特点:

1.模块化

Nest.js 允许将代码分解为单独的可管理模块,从而使其更易于维护。让我们看看下面的模块。

import { Module } from '@nestjs/common';@Module({ imports: [  CacheModule ], controllers: [PaymentController], providers: [PaymentService],})export class PaymentModule {}

payment module可以导出到其它模块。在此示例中,已导出common模块中的cache module。

由于 nest.js 具有模块结构,也比较易于维护。

2.可扩展

Nest.js 通过将应用程序分解为可管理的模块,支持灵活的组件替换以及通过微服务和异步操作容纳高流量,实现了无缝扩展。

它确保在保持可靠性的同时高效处理增加的工作负载。

3.依赖注入

依赖注入只是向类添加外部依赖项而不是在类本身内创建依赖项的方法。让我们看一个代码例子。

import { HttpException, Injectable, NotFoundException} from '@nestjs/common';@Injectable()export class PaymentService { constructor() {} getReceipt() {   return 'Payment Receipt'; }}

上面我们已经创建payment service并添加了@Injectable()注释以使其可注入。可以按如下所述使用创建的服务。

import { Controller, Get, Post, Body } from '@nestjs/common';import { PaymentService } from './payment.service';@Controller('payment')export class PaymentController { constructor(private readonly paymentService: PaymentService) {}@Get() getPaymentReceipt() { return this.paymentService.getReceipt(); }}

4. 类型安全

Nest.js 使用 TypeScript 提供类型安全,可用于捕获开发过程中的潜在错误,并提高代码的可维护性。请来看一个代码例子:

export class PaymentDto {  @IsNotEmpty()  @IsEnum(SERVICE_PROVIDER_SLUG, {    message: `Invalid serviceProvider. Valid options are: ${Object.values(SERVICE_PROVIDER_SLUG).join(', ')}`,  })  serviceProvider: string;  @IsNotEmpty()  @IsNumber()  value: number;  @IsNotEmpty()  @IsString()  validityPeriod: string;  @IsNotEmpty()  @IsArray()  @ArrayNotEmpty()  @ValidateNested()  @Type(() => PaymentAttributesDto)  paymentAttributes: PaymentAttributesDto[]}

在这个例子中,我们创建了一个包含多个参数的 Paymentdto类,并添加了注释来验证参数类型。

举个例子,如果我们向“value”参数发送一个字符串类型值,它将抛出一个异常。

Koa.js:优雅且轻量的框架

Koa.js 是一个更轻、更小、更具表现力的 Web 框架,也是由 Express.js 团队设计的。它允许我们通过异步函数来抛弃回调并处理错误。

框架特点如下:

1. 上下文对象(ctx)

Koa.js 包含一个名为 ctx 的功能,它用于捕获请求和响应详细信息。此上下文传递给每个中间件。可以从以下示例中看到,从methodctxrequest做对象和方法记录。

const Koa = require('koa');const app = new Koa();app.use(async (ctx) => {  const { method, url, request, response } = ctx;  console.log('Method :' + method + ' Request : ' + request);});app.listen(3000);

2. 组成中间件

与 Express Js 很是相似,Koa 支持用于处理 HTTP 请求和响应的中间件函数。在下面的示例中,我们创建了一个简单的中间件:

const Koa = require('koa');const app = new Koa();app.use(async (ctx, next) => {  await next(); });app.listen(3000);

3. Async/Await 支持

Koa 使用 async/await 语法以更同步的方式编写异步代码。以下代码示例包含使用 async/await 关键字。

const Koa = require('koa'); const app = new Koa(); app.use(async (ctx) => {   const data = await fetchData();   ctx.body = Data: ${data} ; }); app.listen(3000);

4.错误处理

Koa.Js 支持各种类型的错误处理。我们可以使用app.emit()或ctx.throw()来处理错误。下面的示例包含了上面的错误处理方法。

const koa = require('koa'); const app = new koa(); //错误处理方法一app.use(async (ctx, next) => {   try {     await Promise.reject('Something went error');   } catch (err) {     ctx.status = err.status || 500;     ctx.body = err.message;     ctx.app.emit('error', err, ctx);   } }); //错误处理方法二app.use(async (ctx, next) => {   ctx.throw(500, 'error'); }); app.on('error', (err, ctx) => {   console.log(err); }); app.listen(3000);

Hapi.js

Hapi.js 是 Http-API 的缩写,是一个用于开发可扩展 Web 应用程序的开源框架。hapi 最基本的经典用例之一是构建 REST API。

沃尔玛实验室已经使用了 hapi js 来处理“黑色星期五”等活动的流量,“黑色星期五”是网上购物最繁忙的日子之一。

主要特点:

1.配置驱动设计

使用它提供的配置对象,我们能够在 Hapi.js 中配置路由、参数设置和插件等。

const Hapi = require('@hapi/hapi');const server = Hapi.server({  port: 3000,  routes: {    cors: true,  },});server.route({  method: 'GET',  path: '/',  handler: (request, h) => {    return 'Hello, Hapi!';  },});async function start() {  await server.start();  console.log(Server running at ${server.info.uri} );}start();

2. 强大的插件系统

Hapi.js 允许轻松集成插件,它做的很体贴,不会让人有太多麻烦。让我们看一个代码例子。

const start = async function () {     const server = Hapi.server();     await server.register([{         plugin: require('plugin1'),         options: {}     }, {         plugin: require('plugin2'),         options: {}     }]); };

在这个例子中,我们集成了两个插件。可以使用 key 将选项传递给插件的选项列表options中。

3. 身份验证和授权

Hapi.js内置支持各种身份验证策略,并允许开发者轻松定义访问控制策略。

server.route({   method: 'GET',   path: '/private-data',   handler: (request, h) => {     // 仅当经过身份验证时才访问私人数据    const user = request.auth.credentials;     return Welcome, ${user.username}! ;   },   options: {     auth: 'jwt', // 使用 JWT 身份验证策略  }, });

基于上面的代码示例,我们可以直接将认证策略定义为‘jwt’。

4. 输入验证

输入验证是 hapi.js 的另一个重要方面。在options路由对象中,我们可以定义哪些输入需要验证。默认validate对象由以下值组成。

{    headers: true,    params: true,    query: true,    payload: true,    state: true,    failAction: 'error'}

Adonis.js


Adonis.js 框架是 Node.js 中的全功能 MVC 框架。

它能够构建可扩展且可维护的应用程序。Adonis.js 遵循与 Laravel 框架类似的结构,并包含开箱即用的 ORM、身份验证和路由等先进功能。

主要特点:

1.全栈MVC框架

Adonis.js 遵循 MVC 架构模式。使用 MVC 模式的框架有助于组织代码,并使其更易于维护和扩展。如下图示:

2. 集成 ORM(Lucid)用于数据库交互

Adonis.js 拥有自己的 ORM,名为 Lucid。

Lucid 提供了一个富有表现力的查询生成器,并支持各种数据库系统。在 lucid 中,我们可以创建模型来读取和写入数据库。请看下面的代码例子。

const Model = use('Model')class User extends Model {}module.exports = User

我们正在使用此用户模型而不是数据库查询。现在我们正在创建一个路由,在其中获取用户。

使用时很简单,用User 的User.all()方法来轻松获取用户信息。

const Route = use('Route')const User = use('App/Models/User')Route.get('users', async () => {return await User.all()})

3. 用户认证系统

Adonis.js 内置了对用户身份验证和授权的支持。

它还提供了一组用于处理用户会话、密码哈希和访问控制的方法和中间件等,期待你更多的挖掘。

结语

以上,便是2024年的一些主流Nodes框架,虽然写的是 2024,其实就是在后续市场上有一定优势和流行趋势的框架产品。

不论你选择Express.js 是因为它的简单性,还是选择Nest.js因为它的结构良好,还是选择Adonis.js因为它的生产力,还是选择Koa.js因为它的优雅性,选择自己合适且正确的框架都是蛮重要的。

这些框架各有千秋,总是取决于你的需求。了解你的项目需要什么至关重要,并请在此基础上选择合适的框架。

本文旨在帮助你寻找最新趋势、新功能的优秀框架,希望帮助大家成功进行后端开发,提供更好的框架选型参考价值。

感谢大家的阅读!

参考:

https://blog.bitsrc.io/top-5-nodejs-frameworks-in-2024-32c7fe9d49c6