這篇文章主要介紹如何使用NestJS開發(fā)Node.js應(yīng)用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

NestJS 最早在 2017.1 月立項,2017.5 發(fā)布第一個正式版本,它是一個基于 Express,使用 TypeScript 開發(fā)的后端框架。設(shè)計之初,主要用來解決開發(fā) Node.js 應(yīng)用時的架構(gòu)問題,靈感來源于 Angular。
組件容器

NestJS 采用組件容器的方式,每個組件與其他組件解耦,當一個組件依賴于另一組件時,需要指定節(jié)點的依賴關(guān)系才能使用:
import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';
import { OtherModule } from '../OtherModule';
@Module({
imports: [OtherModule],
controllers: [CatsController],
providers: [CatsService],
})
export class CatsModule {}依賴注入(DI)
與 Angular 相似,同是使用依賴注入的設(shè)計模式開發(fā)

當使用某個對象時,DI 容器已經(jīng)幫你創(chuàng)建,無需手動實例化,來達到解耦目的:
// 創(chuàng)建一個服務(wù)
@Inject()
export class TestService {
public find() {
return 'hello world';
}
}
// 創(chuàng)建一個 controller
@Controller()
export class TestController {
controller(
private readonly testService: TestService
) {}
@Get()
public findInfo() {
return this.testService.find()
}
}為了能讓 TestController 使用 TestService 服務(wù),只需要在創(chuàng)建 module 時,作為 provider 寫入即可:
@Module({
controllers: [TestController],
providers: [TestService],
})
export class TestModule {}當然,你可以把任意一個帶 @Inject() 的類,注入到 module 中,供此 module 的 Controller 或者 Service 使用。
背后的實現(xiàn)基于 Decorator + Reflect Metadata,詳情可以查看深入理解 TypeScript - Reflect Metadata 。
細粒化的 Middleware
在使用 Express 時,我們會使用各種各樣的中間件,譬如日志服務(wù)、超時攔截,權(quán)限驗證等。在 NestJS 中,Middleware 功能被劃分為 Middleware、Filters、Pipes、Grards、Interceptors。
例如使用 Filters,來捕獲處理應(yīng)用中拋出的錯誤:
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
catch(exception: any, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
const request = ctx.getRequest();
const status = exception.getStatus();
// 一些其他做的事情,如使用日志
response
.status(status)
.json({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}使用 interceptor,攔截 response 數(shù)據(jù),使得返回數(shù)據(jù)格式是 { data: T } 的形式:
import { Injectable, NestInterceptor, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
export interface Response<T> {
data: T;
}
@Injectable()
export class TransformInterceptor<T>
implements NestInterceptor<T, Response<T>> {
intercept(
context: ExecutionContext,
call$: Observable<T>,
): Observable<Response<T>> {
return call$.pipe(map(data => ({ data })));
}
}使用 Guards,當不具有 'admin' 角色時,返回 401:
import { ReflectMetadata } from '@nestjs/common';
export const Roles = (...roles: string[]) => ReflectMetadata('roles', roles);
@Post()
@Roles('admin')
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}數(shù)據(jù)驗證
得益于class-validator 與class-transformer 對傳入?yún)?shù)的驗證變的非常簡單:
// 創(chuàng)建 Dto
export class ContentDto {
@IsString()
text: string
}
@Controller()
export class TestController {
controller(
private readonly testService: TestService
) {}
@Get()
public findInfo(
@Param() param: ContentDto // 使用
) {
return this.testService.find()
}
}當所傳入?yún)?shù) text 不是 string 時,會出現(xiàn) 400 的錯誤。
GraphQL
GraphQL 由 facebook 開發(fā),被認為是革命性的 API 工具,因為它可以讓客戶端在請求中指定希望得到的數(shù)據(jù),而不像傳統(tǒng)的 REST 那樣只能在后端預(yù)定義。
NestJS 對 Apollo server 進行了一層包裝,使得能在 NestJS 中更方便使用。
在 Express 中使用 Apollo server 時:
const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');
// Construct a schema, using GraphQL schema language
const typeDefs = gql`
type Query {
hello: String
}
`;
// Provide resolver functions for your schema fields
const resolvers = {
Query: {
hello: () => 'Hello world!',
},
};
const server = new ApolloServer({ typeDefs, resolvers });
const app = express();
server.applyMiddleware({ app });
const port = 4000;
app.listen({ port }, () =>
console.log(`Server ready at http://localhost:${port}${server.graphqlPath}`),
);在 NestJS 中使用它:
// test.graphql
type Query {
hello: string;
}
// test.resolver.ts
@Resolver()
export class {
@Query()
public hello() {
return 'Hello wolrd';
}
}使用 Decorator 的方式,看起來也更 TypeScript 。
以上是“如何使用NestJS開發(fā)Node.js應(yīng)用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
名稱欄目:如何使用NestJS開發(fā)Node.js應(yīng)用-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://www.yijiale78.com/article36/psgsg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站制作、動態(tài)網(wǎng)站、手機網(wǎng)站建設(shè)、微信小程序、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容