第十二章 Nest中 Express 和 Fastify

Express是一个用于构建Web应用程序和API的JavaScript框架。它是基于Node.js平台的,并提供了一系列简化了常见Web开发任务的功能,如路由、中间件、模板引擎和数据库集成等。 是一个处理请求、响应的库

其可以通过use一个个中间件来处理请求和返回响应(洋葱模型),我们基于这些中间件能实现各种功能 ,但Express 只是一个处理请求的库,没有开发规范和组织架构的能力,会导致写出来的代码参差不齐 不同人写的代码会差距可能很大。
Express 的 洋葱模型:

而Nest 提供了 IOC、AOP 等架构特性,有着规定的代码组织形式,且有很多很多开箱即用的方案。
用 Node 写一个 http 服务有三个层次:
第一层:直接使用 http、https 的模块

const http = require('http');

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World\n');
});

server.listen(3000, '127.0.0.1', () => {
  console.log('Server running at http://127.0.0.1:3000/');
});

第二层:使用 express、koa 这种库
使用 Express:

const express = require('express');

const app = express();

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

使用 Koa:

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

app.use(async (ctx) => {
  ctx.body = 'Hello World';
});

app.listen(3000, () => {
  console.log('Server running at http://localhost:3000/');
});

第三层:使用 Nest 这种企业级框架

const { NestFactory } = require('@nestjs/core');
const { AppModule } = require('./app.module');

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
  console.log('Server running at http://localhost:3000/');
}
bootstrap();

在 Nest 中,我们需要定义一个 AppModule,并在其中定义控制器和提供者:

const { Module, Controller, Get } = require('@nestjs/common');

@Controller()
class AppController {
  @Get()
  getHello() {
    return 'Hello World!';
  }
}

@Module({
  controllers: [AppController],
})
class AppModule {}

module.exports = {
  AppModule,
};

注意 Nest没有和 Express 进行强耦合 而是做了一层抽象,之后分别提供了 express 和 fastify 的实现,所以我们可以在Nest项目灵活的切换express和 fastify

下面是nest中 express和 fastify 的定义逻辑:

接下来我们创建一个项目来测试:

nest new fastify-test -p npm

1718440311975.png
启动项目:

pnpm run start:dev

访问 http://localhost:3000
1718440472486.png
成功启动项目
_注意:我们创建的项目 默认是使用 _express
如果想切换使用 fastify 则需要安装 fastify 和 @nestjs/platform-fastify

npm install fastify @nestjs/platform-fastify

接着修改main.ts
1718440797889.png

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { FastifyAdapter } from '@nestjs/platform-fastify';

async function bootstrap() {
  const app = await NestFactory.create(AppModule, new FastifyAdapter());
  await app.listen(3000);
}
bootstrap();

这样就成功切换到使用fastify 但是现在还有一个问题就是我们在使用app.xxx 的时候 没有fastify 相关的提示 使用NestFastifyApplication 之后就有提示方法:
1718441034862.png
接着在controller 里可以注入 fastify 的 reqeust 和 reply 对象:

import { Controller, Get, Request, Response } from '@nestjs/common';
import { AppService } from './app.service';
import { FastifyReply, FastifyRequest } from 'fastify';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) { }

  /**
   * 处理HTTP GET请求并返回一个简单的欢迎信息。
   * 
   * 此方法装饰了`@Get()`注解,表示它将响应HTTP GET请求。
   * 它使用`@Request()`和`@Response()`注解来获取请求和响应对象,以便可以操作它们。
   * 
   * @param request FastifyRequest - 表示当前HTTP请求的对象,包含请求的相关信息。
   * @param reply FastifyReply - 表示当前HTTP响应的对象,允许设置响应头和发送响应体。
   */
  @Get()
  getHello(@Request() request: FastifyRequest, @Response() reply: FastifyReply): string {
    // 设置响应头中的'url'字段为当前请求的URL,以便客户端可以获取请求的URL。
    reply.header('url', request.url)
    // 发送简单的'hello'字符串作为响应体。
    reply.send('hello')
  }
}

注意:如果使用@Response 注入响应对象 那不能使用return 返回响应内容 需要通过 reply.send 来返回内容
当然 如果改成下面的形式也可以直接return响应内容:
将@Response() 设置为 @Response({ passthrough: true })

import { Controller, Get, Request, Response } from '@nestjs/common';
import { AppService } from './app.service';
import { FastifyReply, FastifyRequest } from 'fastify';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) { }

  /**
   * 处理HTTP GET请求并返回一个简单的欢迎信息。
   * 
   * 此方法装饰了`@Get()`注解,表示它将响应HTTP GET请求。
   * 它使用`@Request()`和`@Response()`注解来获取请求和响应对象,以便可以操作它们。
   * 
   * @param request FastifyRequest - 表示当前HTTP请求的对象,包含请求的相关信息。
   * @param reply FastifyReply - 表示当前HTTP响应的对象,允许设置响应头和发送响应体。
   * @returns string - 从appService获取的欢迎信息。
   */
  @Get()
  getHello(@Request() request: FastifyRequest, @Response({ passthrough: true }) reply: FastifyReply): string {
    // 设置响应头中的'url'字段为当前请求的URL,以便客户端可以获取请求的URL。
    reply.header('url', request.url)
    // 调用appService的getHello方法并返回其结果,该结果通常是另一个欢迎信息。
    return 'hello';
  }
}

Nest 不强依赖 express 是因为可能后面会出跟好的http处理库 可以切换到更好用的。这样比较通用、灵活,有更强的扩展性

  • 45
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: ?作为一个AI,我没有“喜欢”的概念,但我可以告诉你两个框架的一些优缺点。NestJS是基于Express构建的,它提供了更好的可扩展性,更好的解耦和更好的代码组织。另一方面,Express是一个更轻量级的框架,早在Node.js出现之前就已经存在,具有更广泛的社区支持和生态系统。因此,这两个框架都有自己的优点和用例。具体哪个更好,需要根据您的实际需求来决定。 ### 回答2: NestJS 和 Express 是两种常用的后端框架。虽然它们都是用于构建 Node.js 服务器应用程序的框架,但它们在一些方面有所不同。 Express 是一个简单、灵活的框架,被广泛使用。它具有简单易懂的路由处理、间件支持和灵活的插件系统。对于那些对服务器开发有经验的开发者来说,使用 Express 构建应用程序非常容易。它还有庞大的社区和大量的第三方库,可以帮助开发者快速完成任务。 NestJS 是一个基于 Express 的框架,它增加了一些功能和约定以提高开发效率。它采用了面向对象的编程模式,提供了依赖注入和模块化开发等特性。NestJS 还具有强大的错误处理机制、可测试性和可维护性。此外,它还支持许多其他功能,例如 WebSockets 和 GraphQL。 实际上,选择 NestJS 还是 Express 取决于你的具体需求。如果你对开发速度和简单性更关注,你可能会选择 Express。如果你对代码结构、可测试性和可维护性更为重视,你可以选择 NestJS。另外,如果你计划构建大型应用程序,NestJS 可能更适合,因为它提供了一些构建大规模应用所需的工具和约定。 总结来说,NestJS 和 Express 都是优秀的后端框架,选择适合自己的框架取决于个人需求和偏好。无论你选择哪个框架,只要你熟悉它并能使用它来构建高质量的应用程序,都能取得良好的效果。 ### 回答3: NestJS和Express是两个流行的Node.js框架,用于构建服务器端应用程序。它们都有各自的优点和用途,这取决于具体的需求和个人偏好。 Express是一个轻量级的框架,非常灵活和易于上手。它具有简单的API和丰富的间件生态系统,允许开发人员快速构建RESTful API和Web应用程序。由于其简单性,Express在小型和型项目非常受欢迎。 NestJS是一个基于强类型的JavaScript的框架,使用面向对象的编程(OOP)和函数式编程的最佳实践。它提供了一种结构化的方式来构建可扩展的应用程序,并提供了许多内置特性,如依赖注入、模块化、间件、异常处理等。NestJS使用Typescript进行开发,可以使代码更加健壮和可维护。它适用于大型和复杂的项目,提供了更多的结构和组织。 因此,选择NestJS还是Express取决于项目的规模和复杂性。如果项目较小且只需创建简单的API,则Express是一个不错的选择,因为它更简单和轻量。但是,如果你要构建大型或复杂的应用程序,特别是需要良好的架构和依赖注入等功能,那么NestJS可能更适合你。它提供了更多的结构和工具,帮助开发人员构建可维护和可扩展的应用程序。 总而言之,无论选择NestJS还是Express,都可以构建出高质量的应用程序。最重要的是根据项目需求和你自己的技术偏好做出选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫ゞ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值