一.项目初始化

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接口教程的资料请关注Devmax其它相关文章!

使用Nest.js实现接口教程示例的更多相关文章

  1. Html5页面二次分享的实现

    这篇文章主要介绍了Html5页面二次分享的实现的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5跳转小程序wx-open-launch-weapp的示例代码

    这篇文章主要介绍了HTML5跳转小程序wx-open-launch-weapp的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. iOS – 开始iOS教程 – 变量之前的下划线?

    这是正确的还是我做错了什么?

  4. ios – Objective C接口,委托和协议

    所以我试图围绕Objctive-C接口,代理和协议.所以我有一个问题:委托是否必须在单独的文件中,或者它是否是您班级中定义的方法?协议就像java接口吗?

  5. ios – watchOS错误:控制器的接口描述中的未知属性

    解决方法创建IBOutlet作为WKInterfacePicker的属性,您将不会收到消息.

  6. 泛型 – MonoTouch和支持变体通用接口

    如果是这样,MonoTouch中针对这种情况的推荐解决方法是什么?解决方法这实际上取决于编译器而不是Mono版本.IOW有些东西可能适用于Mono2.10而不适用于MonoTouch6.x.当前版本的MonoTouch附带了smcs编译器和基于2.1的配置文件.较新的功能,如协方差,需要一个完整的4.0编译器和运行时.未来版本的MonoTouch将提供4.0/4.5运行时和编译器.

  7. ios – 用于 – 在Counterparts中的ViewController.swift(接口)文件是什么

    有人可以这么善良并解释这个文件的目的是什么?

  8. ios6 – 检测UIViewController上的接口旋转,即使未在 – (NSUInteger)supportedInterfaceOrientations中定义

    解决方法尝试使用UIDevice实例来检测设备物理方向的变化.要开始接收通知,您可以使用类似的内容:要取消注册接收设备旋转事件,请使用此选项:这是deviceDidRotate函数的一个例子:

  9. Swift开发快速上手系列教程目录-陆续完善,由浅入深

    Swift开发教程一.Swift基础Swift教程01-使用switfc终端命令编译运行swift程序Swift教程02-抓住下一个浪潮之巅Swift教程03-playground剖析swift语言Swift教程04-定义声明变量重要原则Swift教程05-基本数据类型(一)整型浮点型Swift教程06-基本数据类型(二)Bool布尔类型对比Java-boolean,Objc-BOOLSwift教

  10. 接口和扩展

    classSimpleClass:ExampleProtocol{String="Averysimpleclass."varanotherProperty:Int=120funcadjust(){simpleDescription+="Now100%adjust."}funcadd(){simpleDescription+="Now50%add."}}vara=SimpleClass()a.adjust()letaDescription=a.simpleDescriptionstructSimpleStr

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部