使用Nest.js实现接口教程示例

目录
  • 一.项目初始化
  • 二.核心文件介绍
  • 三.创建一个接口模块,处理请求
  • 四.看看cats模块有啥吧
    • 1.先看controller吧,请求方法都在这了
    • 2.你这地址有点单调啊,能不能接收query参数的?
  • 五.连接mysql数据库
  • 六.操作数据库
  • 七.中间件你应该了解过吧,在这里应该怎么用呢

一.项目初始化

1.安装脚手架

npm i -g @nestjs/cli

2.创建项目

nest new 项目名称

3. cd 到项目

4.安装依赖

npm i

5.启动项目,监视文件,自动重新编译和重新加载服务器

npm run start:dev

6.查看启动项目启动端口号,进入程序入口文件 src/main.ts 查看

浏览器打开 http://localhost:3000/

二.核心文件介绍

app.controller.spec.ts 控制器的单元测试,也不知道怎么用的。

app.controller.ts 路由的基本控制器,就是操作逻辑的地方,处理请求响应。

app.module.ts 应用程序的根模块。

app.service.ts 写数据库查询语句的地方。

main.ts 应用程序的入口文件,它使用核心函数NestFactory创建一个 Nest 应用程序实例。

三.创建一个接口模块,处理请求

为了快速创建内置验证的 CRUD 控制器,您可以使用 CLI 的CRUD 生成器nest g resource [name]

这里根据官方文档提示创建cats模块

nest g resource cats

选择 REST API风格。

好了,现在src文件目录下多了cats目录,赶紧看看吧。

诶,我们是创建了cats模块了,我们有使用吗,有的,在哪里使用了呢?在应用程序的根模块里使用了啊,哦,原来使用nest g resource cats命令创建时,同时使用了,真方便,ok快去看看吧。

四.看看cats模块有啥吧

1.先看controller吧,请求方法都在这了

首先,映入眼帘的是头部引入了很多很多......啥,不知道是啥。

接下去看吧,有一个@Controller('cats'),这是个装饰器,里面有个参数喔,估计是路由前缀吧,接着看有几个@开头的 post、get、delete的东东,应该是接口方法,嗯,是的,我们去用APIFox请求一下

我这个get请求返回了“This action returns all cats”,这不是我写的啊,在哪里的,走,去看看。

@Get()
findAll() {
    return this.catsService.findAll();
}

大哥,我在controller找到这么个玩意,是个service方法耶,让我按着我的Ctrl键点击findAll进去看看先。进到了cats.service.ts文件,里面有一个findAll方法,返回了一串英文,我不懂英文喔,改改才行,我是个大帅b!!!

2.你这地址有点单调啊,能不能接收query参数的?

肯定能啊

那行,我给你传个?sex=1,你返回个字给我。

这还不简单? 先在controller头顶哪里的@nestjs/common导入 Req然后使用

// 导入类型
import { Request } from 'express';
@Get()
  findAll(@Req() req: Request): string {
    console.log('req:', req.query);
    return this.catsService.findAll(req.query.sex as string);
  }

ps: 这里获取参数其实可以用 @Query,不知道咋的用了上面这种,哈哈哈

这时候,我打印出了所有的query参数。就差给他返回字了。

cats.service.ts
findAll(sex: string) {
    const sexObj = {
      '0': '男',
      '1': '女',
    };
    return sexObj[sex];
  }

写好了,赶紧在APIFox看看结果。

返回结果正确,我还想在post请求传param参数给你,传传传,传你个头头,好吧,那我想查数据库,总行了吧。

五.连接mysql数据库

先安装管理数据库typeorm和连接数据库mysql2

npm install --save @nestjs/typeorm typeorm mysql2

然后在app.module.ts添加配置

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { CatsModule } from './cats/cats.module';
@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: '127.0.0.1',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'blog',
      entities: ['dist/**/*.entity{.ts,.js}'],
      synchronize: true,
    }),
    CatsModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

好了,数据库连接成功。

我们现在是用typeorm来管理数据库,这个库是通过实体来映射到数据库表的,建表我们以前是直接在数据库中创建表结构,现在我们通过实体来创建库。什么意识呢?接下来一起尝试。

在cats文件夹下,有一个entities文件夹,用来放实体的,点开,发现有个ts文件,没错我们就是在这个ts文件来写实体,也就是数据库表结构。

我写了这些东西:

import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
// 建立一个实体映射到数据库表
@Entity('cats')
export class Cat {
  @PrimaryGeneratedColumn()
  id: number;
  @Column({ length: 10 })
  name: string;
}

@Entity('cats')用来修饰说,我这个类是一个实体啊,名字叫cats,其中有字段:id、name,你按照这个结构,在mysql中创建一个表吧。我们打开数据库,看下是不是创建了一个叫cats的表呢。

好,没什么问题,可以映射。我们再添加一个desc字段试试

没毛病。

六.操作数据库

实体有了,怎么使用呢?

我们操作数据库正常情况下都是在service中,那么就是去service中使用即可,直接贴代码,我们向数据库中插入一条数据

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { CreateCatDto } from './dto/create-cat.dto';
import { UpdateCatDto } from './dto/update-cat.dto';
import { Cat } from './entities/cat.entity';
@Injectable()
export class CatsService {
  constructor(
    @InjectRepository(Cat)
    private readonly catRepository: Repository<Cat>,
  ) {}
  async create(createCatDto: Partial<CreateCatDto>): Promise<Cat> {
    console.log(createCatDto);
    return this.catRepository.save(createCatDto);
  }
}

啊哈,保存的时候报错了,说什么实体没有引用,那么我们就引用它,在cats.module.ts

import { Module } from '@nestjs/common';
import { CatsService } from './cats.service';
import { CatsController } from './cats.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Cat } from './entities/cat.entity';
@Module({
  imports: [TypeOrmModule.forFeature([Cat])],
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}

service写好了,但是还没调用它呢,去哪里调用啊,controller啊,这么快就忘记了吗。

import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  Req,
} from '@nestjs/common';
import { CatsService } from './cats.service';
import { CreateCatDto } from './dto/create-cat.dto';
import { UpdateCatDto } from './dto/update-cat.dto';
import { Request } from 'express';
@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}
  @Post('/create')
  create(@Body() createCatDto: CreateCatDto) {
    console.log(createCatDto);
    return this.catsService.create(createCatDto);
  }
}

细心的盆友发现了,说你这CreateCatDto哪里来的?你看看cats目录下有一个dto文件夹,有个create-cat.dto.ts,它就是从这里来的,哈哈哈

export class CreateCatDto {
  name: string;
  desc: string;
}

好啦好啦,去ApiFox看下结果

发送请求,OK,没报错,我们去数据库瞧瞧,有没有数据

牛逼啊,大哥,原来写接口这么简单啊!!!
感谢观看!!!

七.中间件你应该了解过吧,在这里应该怎么用呢

老规矩先创建对应的文件,nestjs有快捷创建中间件的命令呢

nest g middleware middleware/reqMi

我创建了一个middleware目录下的叫reqMi中间件,命名吗,简单了点。
好,看看中间件现在有什么

import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()
export class ReqMiMiddleware implements NestMiddleware {
  use(req: any, res: any, next: () => void) {
    console.log('你好,我是中间件');
    next();
  }
}

我这里打印了一句话。 那么怎么调用呢?调用中间件有很多种方式,可以参考官方文档哦。
我现在是在app.module.ts调用

export class AppModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(ReqMiMiddleware).forRoutes('cats');
  }
}

ReqMiMiddleware被调用啦,forRoutes('cats'),表示为路由为cats前缀的路由添加这个中间件,nestjs中间件,都是通过匹配路由路径来调用的,官方有比较详细的介绍。 我们现在去看看,是不是调用成功了呀。

控制台打印

ok,中间件应用成功啦。

以上就是使用Nest.js实现接口教程示例的详细内容,更多关于Nest.js接口教程的资料请关注我们其它相关文章!

(0)

相关推荐

  • Dapr+NestJs编写Pub及Sub装饰器实战示例

    目录 系列 Dapr JavaScript SDK 安装 结构 实战 Demo 源码 准备环境和项目结构 注入 Dapr 赖项 配置 Dapr 组件(rabbitMQ) API/Gateway 服务 内部监听微服务 @DaprPubSubscribe 装饰器 运行应用程序 Dapr 是一个可移植的.事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的.无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和开发框架.Dapr 确保开发人员专注于编写业务逻辑,不必分神解

  • Flutter Widgets粘合剂CustomScrollView NestedScrollView滚动控件

    目录 概述: CustomScrollView 相互嵌套场景 NestedScrollView 滚动隐藏AppBar SliverAppBar展开折叠 与TabBar配合使用 总结: 概述: Flutter中常用的滑动布局 ScrollView 有 SingleChildScrollView.NestedScrollView.CustomScrollView. SingleChildScrollView 用来处理简单可滑动的页面布局视图,如一般的数据详情页面,当内容足够多时,一屏显示不下时,就需

  • 从reflect metadata理解Nest实现原理

    目录 正文 入口Module 引入模块 CatsService操作数据库 Reflect Metadata 那元数据存在哪呢? nest 的源码: 总结 正文 Nest 是 Node.js 的服务端框架,它最出名的就是 IOC(inverse of control) 机制了,也就是不需要手动创建实例,框架会自动扫描需要加载的类,并创建他们的实例放到容器里,实例化时还会根据该类的构造器参数自动注入依赖. 它一般是这样用的: 入口Module 引入模块 比如入口 Module 里引入某个模块的 Mo

  • Nest.js快速启动API项目过程详解

    目录 快速启动 使用nest自带的命令行工具 直接使用starter项目 用npm安装所需的包 创建controller 创建service 结构和命名 HTTP请求 处理Axios对象 配置 全局添加headers API文档 快速启动 最近上了一个新项目,这个客户管理一个庞大的任务和团队集群,而不同流程所适用的系统也不太一样,比如salesforce,hubspots之类的.这次的新项目需要在另外两个平台之间做一些事情.目前只需要先封装其中之一的API,因此我们选定使用NodeJS的框架Ne

  • Nest 复杂查询示例解析

    目录 Nest 复杂查询 QueryUserDto是查询参数类型 UserService如何实现 Nest 复杂查询 复杂查询包括分页.模糊查询.多条件筛选.排序等,满足前端对查询的所有诉求. Nest 复杂查询,主要使用 repository.findAndCount()方法实现. 假设有一个能分页查询所有用户,可根据用户名进行筛选,并对结果按照更新时间倒序排序的需求,它的 controller 如下: @Post() @Roles(Role.Admin, Role.SuperAdmin) a

  • Docker Compose+Nestjs构建Dapr Redis发布订阅分布式应用

    目录 Dapr(分布式应用程序运行时)介绍 实战 Dapr 的 Redis 发布/订阅应用 1. 创建项目 2. 创建 Dapr Placement 服务 3. 创建 Redis Publish 服务 4. 创建 Dapr Pub-Sub 组件 5. 创建 Redis Dapr Sidecar 6. 创建 NestJS Server 7. 为 NestJS 订阅服务器创建 Dockerfile 8. 将 NestJS 订阅服务添加到 docker-compose 文件 9. 创建 Dapr 订阅

  • Nest框架中集成使用Swagger示例说明

    目录 Swagger Nest 中使用 Swagger 安装 初始化 Swagger 接口中使用 Swagger Swagger 是一个能够生成.描述.调用和可视化的 RESTful 风格的 Web 服务.主要是对 REST API 接口自动生成接口说明文档.生成的接口文档也是直接在线测试.即在可视化的Web 界面上直接输入参数对应的值就可以在线测试接口. Nest 框架也提供了一个专门用于支持 Swagger 规范的模块. Nest 中使用 Swagger 安装 首先需要安装所需要的 swag

  • 使用Nest.js实现接口教程示例

    目录 一.项目初始化 二.核心文件介绍 三.创建一个接口模块,处理请求 四.看看cats模块有啥吧 1.先看controller吧,请求方法都在这了 2.你这地址有点单调啊,能不能接收query参数的? 五.连接mysql数据库 六.操作数据库 七.中间件你应该了解过吧,在这里应该怎么用呢 一.项目初始化 1.安装脚手架 npm i -g @nestjs/cli 2.创建项目 nest new 项目名称 3. cd 到项目 4.安装依赖 npm i 5.启动项目,监视文件,自动重新编译和重新加载

  • Nest.js 授权验证的方法示例

    0x0 前言 系统授权指的是登录用户执行操作过程,比如管理员可以对系统进行用户操作.网站帖子管理操作,非管理员可以进行授权阅读帖子等操作,所以实现需要对系统的授权需要身份验证机制,下面来实现最基本的基于角色的访问控制系统. 0x1 RBAC 实现 基于角色的访问控制(RBAC)是围绕角色的特权和定义的策略无关的访问控制机制,首先创建个代表系统角色枚举信息 role.enum.ts: export enum Role { User = 'user', Admin = 'admin' } 如果是更复

  • node.js中Util模块作用教程示例详解

    目录 从类型判断说起 严格相等 Error First & Promise 调试与输出 从类型判断说起 在 JavaScript 中,进行变量的类型校验是一个非常令人头疼的事,如果只是简单的使用 typeof 会到各种各样的问题. 举几个简单的: console.log(typeof null) // 'object' console.log(typeof new Array) // 'object' console.log(typeof new String) // 'object' 后来,大

  • Caffe数据可视化环境python接口配置教程示例

    目录 引言 一.安装python和pip 二.安装pyhon接口依赖库 三.利用anaconda来配置python环境 四.编译python接口 五.安装jupyter 引言 caffe程序是由c++语言写的,本身是不带数据可视化功能的.只能借助其它的库或接口,如opencv, python或matlab.大部分人使用python接口来进行可视化,因为python出了个比较强大的东西:ipython notebook, 现在的最新版本改名叫jupyter notebook,它能将python代码

  • 前端进阶JS数组高级用法大全教程示例

    目录 1.批量制造数据 2.数组合并去重 3.创建数组的几种方式 4.类数组 常见的类数组 判断是否是类数组 类数组如何转换为数组 如何让类数组使用上数组丰富的内建方法 类数组和数组的区别 5.数组方法的使用注意事项 数组的长度 数组的空元素 empty 基于值进行运算,空位的值作为undefined join和toString,空位怎么处理 数组不会自动添加分号 indexOf与includes 数组可变长度问题 数组查找和过滤 改变自身的方法 delete误区 push vs concat

  • js异步接口并发数量控制的方法示例

    请实现如下的函数(发请求的函数可以直接使用fetch) 可以批量请求数据,所有的URL地址在urls参数中 同时可以通过max参数 控制请求的并发度 当所有的请求结束后,需要执行callback回调 function sendRequest (urls: string[], max: number, callback: () => void) {} fetch 函数返回的是一个promise,promise对象在实例化的时候就已经开始执行了. 简易实现 function fetch(url) {

  • vue实例成员 插值表达式 过滤器基础教程示例详解

    目录 一. 什么是Vue 二.为什么学Vue 三.如何使用Vue 下载安装? 插值表达式 四.vue特点 1.虚拟DOM 2.数据的双向绑定 3.单页面应用 4.数据驱动 五.Vue实例 六.实例成员 - 挂载点 | el - 自定义插值表达式括号| delimiters - 数据 | data - 过滤器 | filters - 方法 | methods - js对象(即字典)补充 - 插值表达式转义 | delimters - 计算属性 | computed - 监听属性 | watch 一

  • TypeScript类型系统自定义数据类型教程示例

    目录 TypeScript 类型系统和自定义数据类型 什么是类型系统 函数类型 类型别名 可选参数 默认参数 函数重载 接口类型 可选属性 只读属性 接口扩展 多重接口声明 接口的索引签名 用接口描述函数 类类型 implements关键字 类的静态端类型和实例端类型 将 this 作为类型 将 this 作为参数 枚举 枚举类型 枚举的成员类型 枚举的成员 字面量类型 联合类型 交叉类型 泛型 泛型函数 泛型接口 泛型类 在工厂函数中使用泛型 泛型约束 在泛型约束中使用类型参数 在泛型中使用条

  • Three.js快速入门教程

    引言 本文主要是讲解Three.js的相关概念,帮助读者对Three.js以及相关知识形成比较完整的理解. 近年来web得到了快速的发展.随着HTML5的普及,网页的表现能力越来越强大.网页上已经可以做出很多复杂的动画,精美的效果. 但是,人总是贪的.那么,在此之上还能做什么呢?其中一种就是通过WebGL在网页中绘制高性能的3D图形. OpenGL,WebGL到Three.js OpenGL大概许多人都有所耳闻,它是最常用的跨平台图形库. WebGL是基于OpenGL设计的面向web的图形标准,

随机推荐