使用Nest.js實(shí)現(xiàn)接口教程示例
一.項(xiàng)目初始化
1.安裝腳手架
npm i -g @nestjs/cli
2.創(chuàng)建項(xiàng)目
nest new 項(xiàng)目名稱
3. cd 到項(xiàng)目
4.安裝依賴
npm i
5.啟動(dòng)項(xiàng)目,監(jiān)視文件,自動(dòng)重新編譯和重新加載服務(wù)器
npm run start:dev
6.查看啟動(dòng)項(xiàng)目啟動(dòng)端口號(hào),進(jìn)入程序入口文件 src/main.ts 查看
瀏覽器打開 http://localhost:3000/
二.核心文件介紹
app.controller.spec.ts 控制器的單元測試,也不知道怎么用的。
app.controller.ts 路由的基本控制器,就是操作邏輯的地方,處理請求響應(yīng)。
app.module.ts 應(yīng)用程序的根模塊。
app.service.ts 寫數(shù)據(jù)庫查詢語句的地方。
main.ts 應(yīng)用程序的入口文件,它使用核心函數(shù)NestFactory創(chuàng)建一個(gè) Nest 應(yīng)用程序?qū)嵗?/p>
三.創(chuàng)建一個(gè)接口模塊,處理請求
為了快速創(chuàng)建內(nèi)置驗(yàn)證的 CRUD 控制器,您可以使用 CLI 的CRUD 生成器:nest g resource [name]。
這里根據(jù)官方文檔提示創(chuàng)建cats模塊
nest g resource cats
選擇 REST API風(fēng)格。
好了,現(xiàn)在src文件目錄下多了cats目錄,趕緊看看吧。
誒,我們是創(chuàng)建了cats模塊了,我們有使用嗎,有的,在哪里使用了呢?在應(yīng)用程序的根模塊里使用了啊,哦,原來使用nest g resource cats命令創(chuàng)建時(shí),同時(shí)使用了,真方便,ok快去看看吧。
四.看看cats模塊有啥吧
1.先看controller吧,請求方法都在這了
首先,映入眼簾的是頭部引入了很多很多......啥,不知道是啥。
接下去看吧,有一個(gè)@Controller('cats'),這是個(gè)裝飾器,里面有個(gè)參數(shù)喔,估計(jì)是路由前綴吧,接著看有幾個(gè)@開頭的 post、get、delete的東東,應(yīng)該是接口方法,嗯,是的,我們?nèi)ビ肁PIFox請求一下

我這個(gè)get請求返回了“This action returns all cats”,這不是我寫的啊,在哪里的,走,去看看。
@Get()
findAll() {
return this.catsService.findAll();
}
大哥,我在controller找到這么個(gè)玩意,是個(gè)service方法耶,讓我按著我的Ctrl鍵點(diǎn)擊findAll進(jìn)去看看先。進(jìn)到了cats.service.ts文件,里面有一個(gè)findAll方法,返回了一串英文,我不懂英文喔,改改才行,我是個(gè)大帥b?。?!

2.你這地址有點(diǎn)單調(diào)啊,能不能接收query參數(shù)的?
肯定能啊
那行,我給你傳個(gè)?sex=1,你返回個(gè)女字給我。
這還不簡單? 先在controller頭頂哪里的@nestjs/common導(dǎo)入 Req然后使用
// 導(dǎo)入類型
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: 這里獲取參數(shù)其實(shí)可以用 @Query,不知道咋的用了上面這種,哈哈哈
這時(shí)候,我打印出了所有的query參數(shù)。就差給他返回女字了。
cats.service.ts
findAll(sex: string) {
const sexObj = {
'0': '男',
'1': '女',
};
return sexObj[sex];
}
寫好了,趕緊在APIFox看看結(jié)果。

返回結(jié)果正確,我還想在post請求傳param參數(shù)給你,傳傳傳,傳你個(gè)頭頭,好吧,那我想查數(shù)據(jù)庫,總行了吧。
五.連接mysql數(shù)據(jù)庫
先安裝管理數(shù)據(jù)庫typeorm和連接數(shù)據(jù)庫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 {}
好了,數(shù)據(jù)庫連接成功。
我們現(xiàn)在是用typeorm來管理數(shù)據(jù)庫,這個(gè)庫是通過實(shí)體來映射到數(shù)據(jù)庫表的,建表我們以前是直接在數(shù)據(jù)庫中創(chuàng)建表結(jié)構(gòu),現(xiàn)在我們通過實(shí)體來創(chuàng)建庫。什么意識(shí)呢?接下來一起嘗試。
在cats文件夾下,有一個(gè)entities文件夾,用來放實(shí)體的,點(diǎn)開,發(fā)現(xiàn)有個(gè)ts文件,沒錯(cuò)我們就是在這個(gè)ts文件來寫實(shí)體,也就是數(shù)據(jù)庫表結(jié)構(gòu)。
我寫了這些東西:
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
// 建立一個(gè)實(shí)體映射到數(shù)據(jù)庫表
@Entity('cats')
export class Cat {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 10 })
name: string;
}
@Entity('cats')用來修飾說,我這個(gè)類是一個(gè)實(shí)體啊,名字叫cats,其中有字段:id、name,你按照這個(gè)結(jié)構(gòu),在mysql中創(chuàng)建一個(gè)表吧。我們打開數(shù)據(jù)庫,看下是不是創(chuàng)建了一個(gè)叫cats的表呢。

好,沒什么問題,可以映射。我們再添加一個(gè)desc字段試試

沒毛病。
六.操作數(shù)據(jù)庫
實(shí)體有了,怎么使用呢?
我們操作數(shù)據(jù)庫正常情況下都是在service中,那么就是去service中使用即可,直接貼代碼,我們向數(shù)據(jù)庫中插入一條數(shù)據(jù)
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);
}
}
啊哈,保存的時(shí)候報(bào)錯(cuò)了,說什么實(shí)體沒有引用,那么我們就引用它,在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寫好了,但是還沒調(diào)用它呢,去哪里調(diào)用啊,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);
}
}
細(xì)心的盆友發(fā)現(xiàn)了,說你這CreateCatDto哪里來的?你看看cats目錄下有一個(gè)dto文件夾,有個(gè)create-cat.dto.ts,它就是從這里來的,哈哈哈
export class CreateCatDto {
name: string;
desc: string;
}
好啦好啦,去ApiFox看下結(jié)果

發(fā)送請求,OK,沒報(bào)錯(cuò),我們?nèi)?shù)據(jù)庫瞧瞧,有沒有數(shù)據(jù)

牛逼啊,大哥,原來寫接口這么簡單?。。?!
感謝觀看!?。?/p>
七.中間件你應(yīng)該了解過吧,在這里應(yīng)該怎么用呢
老規(guī)矩先創(chuàng)建對應(yīng)的文件,nestjs有快捷創(chuàng)建中間件的命令呢
nest g middleware middleware/reqMi
我創(chuàng)建了一個(gè)middleware目錄下的叫reqMi中間件,命名嗎,簡單了點(diǎn)。
好,看看中間件現(xiàn)在有什么
import { Injectable, NestMiddleware } from '@nestjs/common';
@Injectable()
export class ReqMiMiddleware implements NestMiddleware {
use(req: any, res: any, next: () => void) {
console.log('你好,我是中間件');
next();
}
}
我這里打印了一句話。 那么怎么調(diào)用呢?調(diào)用中間件有很多種方式,可以參考官方文檔哦。
我現(xiàn)在是在app.module.ts調(diào)用
export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(ReqMiMiddleware).forRoutes('cats');
}
}
ReqMiMiddleware被調(diào)用啦,forRoutes('cats'),表示為路由為cats前綴的路由添加這個(gè)中間件,nestjs中間件,都是通過匹配路由路徑來調(diào)用的,官方有比較詳細(xì)的介紹。 我們現(xiàn)在去看看,是不是調(diào)用成功了呀。

控制臺(tái)打印

ok,中間件應(yīng)用成功啦。
以上就是使用Nest.js實(shí)現(xiàn)接口教程示例的詳細(xì)內(nèi)容,更多關(guān)于Nest.js接口教程的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Bootstrap實(shí)現(xiàn)漸變頂部固定自適應(yīng)導(dǎo)航欄
這篇文章給大家介紹了Bootstrap實(shí)現(xiàn)漸變頂部固定自適應(yīng)導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
JS switch判斷 三目運(yùn)算 while 及 屬性操作代碼
這篇文章主要介紹了JS switch判斷 三目運(yùn)算 while 及 屬性操作代碼,需要的朋友可以參考下2017-09-09
小程序點(diǎn)擊圖片實(shí)現(xiàn)自動(dòng)播放視頻
這篇文章主要為大家詳細(xì)介紹了小程序點(diǎn)擊圖片實(shí)現(xiàn)自動(dòng)播放視頻,停止上一個(gè)視頻播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11
js實(shí)現(xiàn)瀏覽器窗口大小被改變時(shí)觸發(fā)事件的方法
這篇文章主要介紹了js實(shí)現(xiàn)瀏覽器窗口大小被改變時(shí)觸發(fā)事件的方法,實(shí)例分析了window.onresize方法的使用技巧,需要的朋友可以參考下2015-02-02
JavaScript實(shí)現(xiàn)相冊彈窗功能(zepto.js)
這篇文章主要介紹了JavaScript基于zepto.js實(shí)現(xiàn)相冊彈窗功能的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06
javascript實(shí)現(xiàn)信息的顯示和隱藏如注冊頁面
信息的顯示和隱藏在某些時(shí)候還是比較使用的,就比如注冊信息,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以了解下2013-12-12

