使用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 查看
瀏覽器打開(kāi) http://localhost:3000/
二.核心文件介紹
app.controller.spec.ts 控制器的單元測(cè)試,也不知道怎么用的。
app.controller.ts 路由的基本控制器,就是操作邏輯的地方,處理請(qǐng)求響應(yīng)。
app.module.ts 應(yīng)用程序的根模塊。
app.service.ts 寫(xiě)數(shù)據(jù)庫(kù)查詢語(yǔ)句的地方。
main.ts 應(yīng)用程序的入口文件,它使用核心函數(shù)NestFactory創(chuàng)建一個(gè) Nest 應(yīng)用程序?qū)嵗?/p>
三.創(chuàng)建一個(gè)接口模塊,處理請(qǐng)求
為了快速創(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)用程序的根模塊里使用了啊,哦,原來(lái)使用nest g resource cats命令創(chuàng)建時(shí),同時(shí)使用了,真方便,ok快去看看吧。
四.看看cats模塊有啥吧
1.先看controller吧,請(qǐng)求方法都在這了
首先,映入眼簾的是頭部引入了很多很多......啥,不知道是啥。
接下去看吧,有一個(gè)@Controller('cats'),這是個(gè)裝飾器,里面有個(gè)參數(shù)喔,估計(jì)是路由前綴吧,接著看有幾個(gè)@開(kāi)頭的 post、get、delete的東東,應(yīng)該是接口方法,嗯,是的,我們?nèi)ビ肁PIFox請(qǐng)求一下

我這個(gè)get請(qǐng)求返回了“This action returns all cats”,這不是我寫(xiě)的啊,在哪里的,走,去看看。
@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è)女字給我。
這還不簡(jiǎn)單? 先在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];
}
寫(xiě)好了,趕緊在APIFox看看結(jié)果。

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

好,沒(méi)什么問(wèn)題,可以映射。我們?cè)偬砑右粋€(gè)desc字段試試

沒(méi)毛病。
六.操作數(shù)據(jù)庫(kù)
實(shí)體有了,怎么使用呢?
我們操作數(shù)據(jù)庫(kù)正常情況下都是在service中,那么就是去service中使用即可,直接貼代碼,我們向數(shù)據(jù)庫(kù)中插入一條數(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ò)了,說(shuō)什么實(shí)體沒(méi)有引用,那么我們就引用它,在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寫(xiě)好了,但是還沒(méi)調(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)了,說(shuō)你這CreateCatDto哪里來(lái)的?你看看cats目錄下有一個(gè)dto文件夾,有個(gè)create-cat.dto.ts,它就是從這里來(lái)的,哈哈哈
export class CreateCatDto {
name: string;
desc: string;
}
好啦好啦,去ApiFox看下結(jié)果

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

牛逼啊,大哥,原來(lái)寫(xiě)接口這么簡(jiǎn)單?。。?!
感謝觀看?。。?/p>
七.中間件你應(yīng)該了解過(guò)吧,在這里應(yīng)該怎么用呢
老規(guī)矩先創(chuàng)建對(duì)應(yīng)的文件,nestjs有快捷創(chuàng)建中間件的命令呢
nest g middleware middleware/reqMi
我創(chuàng)建了一個(gè)middleware目錄下的叫reqMi中間件,命名嗎,簡(jiǎn)單了點(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中間件,都是通過(guò)匹配路由路徑來(lái)調(diào)用的,官方有比較詳細(xì)的介紹。 我們現(xiàn)在去看看,是不是調(diào)用成功了呀。

控制臺(tái)打印

ok,中間件應(yīng)用成功啦。
以上就是使用Nest.js實(shí)現(xiàn)接口教程示例的詳細(xì)內(nèi)容,更多關(guān)于Nest.js接口教程的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
從parcel.js打包出錯(cuò)到選擇nvm的全部過(guò)程
這篇文章主要介紹了從parcel.js打包出錯(cuò)到選擇nvm的全部過(guò)程,需要的朋友可以參考下2018-01-01
js替換字符串中所有指定的字符(實(shí)現(xiàn)代碼)
下面小編就為大家?guī)?lái)一篇js替換字符串中所有指定的字符(實(shí)現(xiàn)代碼)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08
uniapp項(xiàng)目打包為桌面應(yīng)用的方法步驟
本文主要介紹了uniapp項(xiàng)目打包為桌面應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-08-08
關(guān)于js布爾型、null和undefined以及類型檢測(cè)舉例詳解
這篇文章主要介紹了關(guān)于js布爾型、null和undefined以及類型檢測(cè)的相關(guān)資料,涵蓋隱式轉(zhuǎn)換、相等比較及常用檢測(cè)技巧,幫助避免開(kāi)發(fā)中的常見(jiàn)錯(cuò)誤,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-05-05
如何利用JavaScript?實(shí)現(xiàn)繼承
這篇文章主要介紹了如何利用JavaScript?實(shí)現(xiàn)繼承,JavaScript?在編程語(yǔ)言界是個(gè)特殊種類,它和其他編程語(yǔ)言很不一樣,JavaScript可以在運(yùn)行的時(shí)候動(dòng)態(tài)地改變某個(gè)變量的類型,下面小編將繼續(xù)介紹JavaScript如何實(shí)現(xiàn)繼承,需要的朋友可以參考下2022-02-02
Web componentd組件內(nèi)部事件回調(diào)及痛點(diǎn)剖析
這篇文章主要為大家介紹了Web componentd組件內(nèi)部事件回調(diào)示例及其痛點(diǎn)的剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-11-11
JavaScript的模塊化:封裝(閉包),繼承(原型) 介紹
在復(fù)雜的邏輯下, JavaScript 需要被模塊化,模塊需要封裝起來(lái),只留下供外界調(diào)用的接口。閉包是 JavaScript 中實(shí)現(xiàn)模塊封裝的關(guān)鍵,也是很多初學(xué)者難以理解的要點(diǎn)2013-07-07

