本文介绍了Nest框架的基础知识,包括其特点和优势,适用场景以及如何安装和配置Nest框架。文章详细讲解了Nest框架中的基础概念,如控制器、服务、模块和提供者,并提供了实践教程和常见问题解答。通过阅读本文,读者可以全面了解和掌握nest学习的相关知识。
Nest框架是一个基于Node.js和TypeScript的高性能服务器端框架,主要用于构建高效、可扩展的应用程序。它采用了现代的JavaScript工具链,特别是TypeScript,可以提供强类型支持,增强开发效率。Nest框架由Angular团队维护,它借鉴了Angular的设计理念,为开发者提供了一套模块化、可组合的架构模式。
Nest框架适用于构建以下类型的Web应用程序:
安装Nest框架前,首先需要安装Node.js。Node.js可以在其官方网站上下载安装,安装完成后需要验证安装是否成功:
node -v npm -v
确保Node.js和npm版本符合Nest框架的要求。
Nest CLI是一个命令行界面工具,用于创建和管理Nest项目。可以通过以下命令安装Nest CLI:
npm install -g @nestjs/cli
安装完成后,可以通过以下命令验证安装:
nest -v
创建Nest项目需要遵循以下步骤:
nest new my-nest-app
cd my-nest-app
npm run start:dev
启动后,Nest会自动编译并启动应用,可以在浏览器中访问http://localhost:3000
,默认会返回Hello World
。
控制器是负责处理HTTP请求和响应的主要组件。每个控制器都有一个或多个装饰器,用于定义路由和HTTP方法。
import { Controller, Get } from '@nestjs/common'; @Controller('users') export class UsersController { @Get() findAll(): string { return 'This action returns all users'; } }
在这个例子中,@Controller('users')
定义了控制器的路由前缀。@Get()
装饰器定义了一个GET请求处理器,返回一条消息。
服务是执行业务逻辑的组件,通常不直接处理HTTP请求。服务可以被多个控制器共享。
import { Injectable } from '@nestjs/common'; @Injectable() export class UserService { findAll(): string { return 'This action returns all users'; } }
在服务中使用@Injectable()
装饰器标记为可注入的服务。
模块是Nest框架的基本组织单元,每个模块可以包含控制器、服务、提供者等。模块还定义了依赖关系。
import { Module } from '@nestjs/common'; import { UsersController } from './users.controller'; import { UserService } from './users.service'; @Module({ controllers: [UsersController], providers: [UserService], }) export class UsersModule {}
在该模块中,定义了控制器和提供者。
提供者是Nest框架中的可注入对象,例如服务、装饰器和中间件。它们可以被模块内的其他组件共享。
import { Injectable } from '@nestjs/common'; @Injectable() export class UserService { findAll(): string { return 'This action returns all users'; } }
UserService
就是一个提供者,可以被控制器或其他服务共享。
创建一个简单的RESTful API需要以下步骤:
import { Controller, Get } from '@nestjs/common'; @Controller('users') export class UsersController { @Get() findAll(): string { return 'This action returns all users'; } }
import { Injectable } from '@nestjs/common'; @Injectable() export class UserService { findAll(): string { return 'This action returns all users'; } }
import { Module } from '@nestjs/common'; import { UsersController } from './users.controller'; import { UserService } from './users.service'; @Module({ controllers: [UsersController], providers: [UserService], }) export class UsersModule {}
import { Controller, Get, Inject } from '@nestjs/common'; import { UserService } from '../services/user.service'; @Controller('users') export class UsersController { constructor(private readonly userService: UserService) {} @Get() async findAll(): Promise<string> { return this.userService.findAll(); } }
中间件可以用来执行一些特定的任务,例如日志记录、身份验证等。
import { Injectable } from '@nestjs/common'; @Injectable() export class LoggingMiddleware { use(req, res, next) { console.log('Request received:', req.path); next(); } }
import { Module } from '@nestjs/common'; import { LoggingMiddleware } from './logging.middleware'; @Module({ providers: [LoggingMiddleware], }) export class AppModule {}
import { Controller, UseMiddleware } from '@nestjs/common'; import { LoggingMiddleware } from './logging.middleware'; @Controller('users') export class UsersController { @UseMiddleware(LoggingMiddleware) @Get() findAll(): string { return 'This action returns all users'; } }
Nest框架支持使用模板引擎渲染HTML页面。常用的模板引擎包括EJS、Pug等。
npm install @nestjs/core @nestjs/platform-express ejs
import { Module } from '@nestjs/common'; import { HttpModule } from '@nestjs/axios'; import { ServeStaticModule } from '@nestjs/serve-static'; import { EjsAdapter, TemplateService } from '@nestjs-modules/core'; @Module({ imports: [ HttpModule, ServeStaticModule.forRoot({ rootPath: 'public', }), ], providers: [ TemplateService, { provide: TemplateService, useClass: EjsAdapter, }, ], }) export class AppModule {}
在dist/src/templates
目录下创建index.ejs
文件:
<!DOCTYPE html> <html> <head> <title>My Nest App</title> </head> <body> <h1>Welcome to My Nest App</h1> </body> </html>
import { Controller, Get } from '@nestjs/common'; import { TemplateService } from '@nestjs-modules/core'; @Controller('home') export class HomeController { constructor(private readonly templateService: TemplateService) {} @Get() async index(): Promise<string> { return this.templateService.render('index'); } }
Nest框架支持多种数据库,例如MySQL、MongoDB等。这里以MongoDB为例。
npm install @nestjs/microservices @nestjs/mongoose mongoose
import { MongooseModule } from '@nestjs/mongoose'; import { Module } from '@nestjs/common'; @Module({ imports: [ MongooseModule.forRoot('mongodb://localhost:27017/mydatabase'), ], }) export class AppModule {}
import { Document, Schema } from 'mongoose'; export interface User extends Document { name: string; email: string; } export const UserSchema = new Schema({ name: String, email: String, });
import { Injectable } from '@nestjs/common'; import { Model } from 'mongoose'; import { InjectModel } from '@nestjs/mongoose'; import { UserSchema }.