跳转到主要内容

category

探索Hapi、Express.js、NestJS、Koa.js和Adonis.js,在2024年构建您的API

介绍


Node.js自2009年以来一直是人们谈论的话题,大多数后端开发人员倾向于使用Node.js。在过去的几年里,它的受欢迎程度有所提高。


它被称为美国最受欢迎的网络开发工具,包括Netflix和PayPal等客户。

受欢迎程度增加的原因是加载时间的减少和性能的提高。因此,分析2024年排名前五的Node.js后端框架至关重要。

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

顺便说一下,如果你想看看一个简单的演示来构建一个Express API,请看看我的Bit Scope。

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;

// Route for Homepage
app.get('/', (req, res) => {
res.send('Welcome to the homepage!');
});

// Route 2
app.get('/user/:id', (req, res) => {
const userId = req.params.id;
res.send(User Profile Page - 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本身在自然界中是可组合的。您可以在应用程序中的任何位置即插即用组件。

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


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

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

要查看此完整实现,请查看我的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 {}

此支付模块可以导出到其他模块。在本例中,我们导出了该模块中的通用缓存模块。由于nest.js具有模块结构,因此易于维护。

2.可扩展性

Nest.js通过将应用程序分解为可管理的模块,支持灵活的组件替换,并通过微服务和异步操作适应高流量,从而实现无缝扩展。它确保在保持可靠性的同时高效处理增加的工作负载。

3.依赖注入

依赖项注入只是将外部依赖项添加到类中的方法,而不是在类本身中创建它。让我们来看一个例子。

import {
HttpException, Injectable, NotFoundException
} from '@nestjs/common';

@Injectable()
export class PaymentService {

constructor() {}

getReceipt() {
return 'Payment Receipt';
}

}


我们已经创建了支付服务,并添加了@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 :' + method + ' Request : ' + request);
});

app.listen(3000);


2.中间件组成

与ExpressJs非常相似,Koa支持用于处理HTTP请求和响应的中间件功能。在这个例子中,我们创建了一个简单的中间件。

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

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

app.listen(3000);

3.异步/等待支持

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

//Error Handling Method 1
app.use(async (ctx, next) => {
try {
await Promise.reject('Something went wrong');
} catch (err) {
ctx.status = err.status || 500;
ctx.body = err.message;
ctx.app.emit('error', err, ctx);
}
});

//Error Handling Method 2
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最基本的用例之一是构建RESTAPI。

沃尔玛实验室创建了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: {}
}]);
};


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

3.认证和授权

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

server.route({
method: 'GET',
path: '/private-data',
handler: (request, h) => {
// Access private data only if authenticated
const user = request.auth.credentials;
return Welcome, ${user.username}! ;
},
options: {
auth: 'jwt', // Use JWT authentication strategy
},
});


基于该示例,我们可以直接将身份验证策略定义为“jwt”。

4.输入验证

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

{
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提供了一个表达型查询生成器,并支持各种数据库系统。在清醒中,我们可以创建模型来读取和写入数据库。让我们看看下面的例子。

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年实现成功的后端开发之旅。