自打 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 编写代码,并包括面向对象编程、函数式编程和函数式反应式编程。
主要特点:
模块化
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