回顾2024 年受欢迎的五大 Node.js 后端框架

2009 年以来,Node.js 一直是人们讨论的焦点,大多数后端开发人员都倾向于使用 Node.js。在过去的几年里,它的受欢迎程度有所增加。

图片

提高流行度的原因是减少加载时间和性能改进。因此,分析2024年前5名Node.js后端框架至关重要。

因此,本文将介绍2024年前5名Node.js后端框架,它们的特点和常见用例。

Express.js: 经过测试的冠军

图片

Express.js 是Node.js最著名的后端框架之一。它是一个开源的Web应用程序框架,基于Node.js平台免费提供。由于它是一个精简框架,新手和经验丰富的Web开发人员都倾向于选择Express.js。它主要用于创建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本身具有可组合性。您可以在应用程序的任何地方插入和播放组件。

例如,您可以创建中间件组件,可以在任何给定时间插入和移出。

图片

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

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

通过这样做,您能够以可组合的方式快速设计您的应用程序!

要查看完整实现,请查看我的Bit Scope。

NestJS: 现代化和结构化的方法

图片

NestJS是一个以构建可扩展和高效的Node.js服务器端应用程序而闻名的框架。它使用先进的JavaScript,并具有在TypeScript中编写代码的能力。尽管它完全支持TypeScript,但它也可以在纯JavaScript中编写代码,并包括面向对象编程、函数式编程和函数式响应式编程。

关键特性:使其脱颖而出的特点

1. 模块化

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

import { Module } from '@nestjs/common';

@Module({
 imports: [
  CacheModule
 ],
 controllers: [PaymentController],
 providers: [PaymentService],
})
export class PaymentModule {}

这个payment module可以导出到其他模块。在这个例子中,我们在这个模块中导出了常见的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[]

}

在这个例子中,我们创建了一个包含多个参数的dto,并添加了注解来验证参数类型。例如,如果我们向“value”参数发送一个字符串值,它将抛出一个错误。

Koa.js:优雅且轻量

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

关键特性:使其脱颖而出

  1. 上下文对象(ctx)

Koa.js包含一个名为ctx的功能,用于捕获请求和响应的详细信息。这个上下文对象会传递给每个中间件。在这个示例中,我们从ctx对象中记录了方法和请求。

const Koa = require("koa");
const app = new Koa();
app.use(async (ctx) => {
  const { method, url, request, response } = ctx;
  console.log("方法:" + method + " 请求:" + request);
});
app.listen(3000);
  1. 中间件组合

与Express Js非常相似,Koa支持中间件函数来处理HTTP请求和响应。在这个示例中,我们创建了一个简单的中间件。


const Koa = require('koa');
const app = new Koa();

app.use(async (ctx, next) => {
  await next(); 
});

app.listen(3000);
  1. 异步/等待支持

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

const Koa = require('koa');
const app = new Koa();

app.use(async (ctx) => {
  const data = await fetchData();
  ctx.body = `数据:${data}`;
});

app.listen(3000);
  1. 错误处理

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


const koa = require('koa');
const app = new koa();

//错误处理方法1
app.use(async (ctx, next) => {
  try {
    await Promise.reject('出错了');
  } catch (err) {
    ctx.status = err.status || 500;
    ctx.body = err.message;
    ctx.app.emit('error', err, ctx);
  }
});

//错误处理方法2
app.use(async (ctx, next) => {
  ctx.throw(500, '错误');
});

app.on('error', (err, ctx) => {
  console.log(err);
});

app.listen(3000);

Hapi.js

图片

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

Walmart Labs 创建了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: {}
    }]);
};

在这个示例中,我们集成了两个插件。可以使用options键向插件传递选项。

3. 认证和授权

Hapi.js提供了对各种认证策略的内置支持,并允许开发人员轻松定义访问控制策略。

server.route({
  method: 'GET',
  path: '/private-data',
  handler: (request, h) => {
    // 仅在经过身份验证时访问私有数据
    const user = request.auth.credentials;
    return `欢迎,${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.all()来获取用户。

const Route = use('Route')
const User = use('App/Models/User')

Route.get('users', async () => {
return await User.all()
})

3. 认证系统

Adonis.js内置支持用户身份验证和授权。它提供了一组方法和中间件来处理用户会话、密码哈希和访问控制。

结论

在2024年,上述后端框架在市场上占据重要地位。

无论您选择Express.js因其简单性,Nest.js因其结构,Adonis.js因其生产力,还是Koa.js因其优雅,选择正确的框架至关重要。

这始终取决于您的需求。了解项目需要什么是至关重要的,基于此应选择适当的框架。

此外,查找最新趋势、现有框架的新功能以及新框架对于在2024年拥有成功的后端开发之旅至关重要。

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

THE END