Nest.js总结

本文参考Nest中文文档,介绍项目搭建,可全局安装脚手架创建新项目,还可传递 --strict 标志使用 TypeScript 更严格功能集。说明了项目文件结构,介绍创建控制器方法,提及 Nest 提供的 HTTP 方法装饰器。此外,讲解使用 MySQL 数据库,实现新增和查询列表接口。

参考Nest中文文档

启动项目

全局安装Nest.js脚手架,然后利用脚手架创建一个新项目指令如下所示:

$ npm i -g @nestjs/cli

$ nest new my-project-name

要使用 TypeScript 的 更严格 功能集创建新项目,请将 --strict 标志传递给 nest new 命令。
如下所示:nest new [my-project-name] --strict


项目文件

打开刚刚创建的项目文件,展开如下图所示:

├── my-test
│ ├── src
│ │ ├── app.controller.spec.ts
│ │ ├── app.controller.ts
│ │ ├── app.module.ts
│ │ ├── app.service.ts
│ │ └── main.ts
│ ├── test
│ │ ├── app.e2e-spec.ts
│ │ └── jest-e2e.json
│ ├── package.json
│ ├── README.md
│ ├── tsconfig.json
│ ├── …

文件名说明
app.controller.spec.ts控制器的单元测试。
app.controller.ts具有单一路由的基本控制器。
app.module.ts应用的根模块。
app.service.ts具有单一方法的基本服务。
main.ts使用核心函数 NestFactory 创建 Nest 应用实例的应用入口文件。
test/*模块的单元测试文件。

启动项目需要热更新的可以运行指令"start:dev"


创建一个控制器

$ nest g controller [name]

要使用 CLI 创建控制器,只需执行 $ nest g controller [name] 命令即可。
为了避免生成测试文件,你可以传递 --no-spec 标志,如下所示:nest g resource [name] --no-spec

// cats.controller.ts
import { Controller, Get, Post } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Post()
  create(): string {
    return 'This action adds a new cat';
  }

  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

Nest 为所有标准的 HTTP 方法提供装饰器:@Get()、@Post()、@Put()、@Delete()、@Patch()、@Options() 和 @Head()。

状态码
// code.controller.ts
import { Controller, HttpCode, Post } from '@nestjs/common';

@Controller('code')
export class CodeController {
  @Post()
  @HttpCode(204)
  create() {
    return 'This action adds a new cat';
  }
}
重定向
// redirect.controller.ts
import { Controller, Get, Redirect } from '@nestjs/common';

@Controller('redirect')
export class NofoundController {
  @Get()
  @Redirect('/')
  redirectToNewRoute() {}
}

使用数据库

本地安装一个MySQL,然后启动数据库服务,为了方便演示,使用phpStudy这个集成环境;

在项目安装访问数据库的模块:

$ npm install --save @nestjs/typeorm typeorm mysql2

安装过程完成后,我们可以将 TypeOrmModule 导入到根 AppModule 中。

// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      entities: [],
      synchronize: true,
    }),
  ],
})
export class AppModule {}

以上链接数据库的方式可通过配置config,使用环境变量传递,如下所示:

DATABASE_USER=root
DATABASE_PASSWORD=root
实现一个新增接口

import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { DataSource, Repository } from 'typeorm';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
    private dataSource: DataSource,
  ) {}
  async create(createUserDto: CreateUserDto) {
    const { firstName, lastName, isActive } = createUserDto;
    try {
      await this.usersRepository
        .createQueryBuilder('user')
        .insert()
        .into(User)
        .values([{ firstName, lastName, isActive: !!Number(isActive) }])
        .execute();
      return {
        code: '200',
        data: '',
        msg: 'success',
      };
    } catch (error) {
      return {
        code: 'E500',
        data: JSON.stringify(error),
        msg: 'error',
      };
    }
  }
}

实现一个查询列表接口

import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { DataSource, Repository } from 'typeorm';

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
    private dataSource: DataSource,
  ) {}
    async findAll(): Promise<UserList> {
		const data = await this.usersRepository
		  .createQueryBuilder('user')
		  .getMany();
		return {
		  data,
		  code: '200',
		  msg: 'success',
		};
	  }
  }
}

使用数据源查阅TypeORM

### Next.jsNest.js 的特性、用途及区别 #### 1. **Next.js** Next.js 是一个基于 React 的服务器渲染 (SSR, Server-Side Rendering) 框架,主要用于构建现代化的前端应用。以下是其特点: - 提供开箱即用的功能支持,例如静态导出、增量静态再生 (ISR) 和服务端渲染 (SSR)[^1]。 - 支持页面级路由功能,开发者可以轻松定义动态路由和预取数据逻辑[^2]。 - 学习曲线相对较低,适合已经熟悉 JavaScript 或 React 的开发者使用[^1]。 适用场景: - 需要快速搭建具有 SEO 友好的单页或多页 Web 应用程序。 - 对于需要高性能加载时间的应用(如电商网站或新闻平台),Next.js 的 SSR 功能特别有价值[^3]。 ```javascript // Example of a basic page with data fetching in Next.js export async function getServerSideProps(context) { const res = await fetch(`https://api.example.com/data`); const data = await res.json(); return { props: { data } }; } function Page({ data }) { return ( <div> <h1>Data from API</h1> <pre>{JSON.stringify(data, null, 2)}</pre> </div> ); } ``` --- #### 2. **Nest.js** Nest.js 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架。它是受 Angular 启发的一个全栈型框架,专注于后端开发。以下是其特点: - 使用模块化的架构设计,允许开发者将代码分割成独立的模块以便更好地管理和维护[^3]。 - 完全采用 TypeScript 编写,提供了强大的类型检查能力,有助于减少运行时错误并提高开发效率[^3]。 - 内置对多种常见技术的支持,比如 GraphQL、WebSocket 和 gRPC 等[^2]。 适用场景: - 当项目需求复杂度较高或者团队成员希望利用面向对象编程(OOP)原则来组织代码时可以选择 Nest.js。 - 如果目标是创建 RESTful APIs 或微服务架构下的组件,则该工具非常适合[^1]。 ```typescript // Example of creating a simple controller in Nest.js import { Controller, Get } from '@nestjs/common'; @Controller('example') export class ExampleController { @Get() findAll(): string { return 'This is an example endpoint'; } } ``` --- #### 3. **两者的主要区别** | 方面 | Next.js | Nest.js | |---------------|---------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------| | 主要关注领域 | 前端框架,侧重于 UI 层次上的优化 | 后端框架,专攻业务逻辑处理与 API 接口的设计 | | 技术堆栈 | React 生态 | Node.js + Express/Fastify | | 数据获取方式 | 页面级别的数据抓取方法(getStaticProps/getServerSideProps),强调无状态的服务端呈现 | 控制器驱动的数据交互模型,通常返回 JSON 格式的响应 | | 类型安全机制 | 不强制要求,但可以通过引入 TypeScript 来增强 | 默认集成 TypeScript | 尽管它们都属于现代 JavaScript/TypeScript 工具链的一部分,但是各自的目标受众和技术实现方向存在显著不同[^2]。 --- ### 总结 对于那些想要简化前端工作流程的人来说,Next.js 提供了一个无缝衔接的方式去管理复杂的网页内容更新过程;而对于期望拥有更加严谨结构化后台解决方案的企业来说,Nest.js 则展现出了无可比拟的优势——不仅限于性能表现方面,还包括长期维护成本控制等方面都有出色的表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值