nest的核心概念:

Nest的核心概念是提供一种体系结构,它帮助开发人员实现层的最大分离,并在应用程序中增加抽象。

架构预览:

主要有三个核心概念:模块Module,  控制器Controller, 服务与依赖注入 Provider Dependency injection

  1. 模块Module:   用于将代码拆分为独立的和可重用的模块,例如用户信息模块,然后将该用户模块的控制器和服务集合进来,最后直接将用户模块导入到根Module就可以使用了。
  2. 控制器Controller: 负责处理客户端传入的请求参数并向客户端返回响应数据。nest.js提供许多http请求的装饰器,如例如@Body(),@Post()等。控制器不需要定义任何诸如从客户端获取数据、验证用户输入等工作,这些都是交给服务Provider处理,通过把任务委托给各种服务,可以让控制器类更加精简、高效。
  3. 服务Provider :在这里处理所有请求执行逻辑,在控制器中通过constructor函数以依赖注入的方式实现。
    constructor(private readonly catsService: CatsService) {}

其他概念:

中间件Middleware: 中间件功能可以访问请求和响应对象,在路由处理程序之前调用。

// 实现一个带有`@Injectable()`装饰器的类打印中间件
import { Injectable, NestMiddleware, MiddlewareFunction } from '@nestjs/common'; @Injectable()
export class LoggerMiddleware implements NestMiddleware {
resolve(...args: any[]): MiddlewareFunction {
return (req, res, next) => {
console.log('Request...');
next();
};
}
}

使用有两种方式:全局注册和局部模块注册。

//  全局注册
async function bootstrap() {
// 创建Nest.js实例
const app = await NestFactory.create(AppModule, application, {
bodyParser: true,
});
// 注册中间件
app.use(LoggerMiddleware());
// 监听3000端口
await app.listen(3000);
}
bootstrap();
//  模块局部注册
export class CnodeModule implements NestModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.with('ApplicationModule')
.exclude(
{ path: 'user', method: RequestMethod.GET },
{ path: 'user', method: RequestMethod.POST },
)
.forRoutes(UserController);
}
}

全局注册影响全部路由,局部注册只是影响当前路由下的路由。

过滤器Exception filter:负责在整个应用程序中处理所有抛出的异常,同时可以自定义错误状态码和错误消息内容。

管道 Pipe:管道可以把你的请求参数根据特定条件验证类型、对象结构或映射数据。管道是一个纯函数,不应该从数据库中选择或调用任何服务操作。

守卫 Guard:通常用作权限认证

他们之间的执行顺序:

客户端请求 ---> 中间件 ---> 守卫 ---> 拦截器之前 ---> 管道 ---> 控制器处理并响应 ---> 拦截器之后 ---> 过滤器

安装:

npm i -g @nestjs/cli

初始化项目:

$ nest new my-awesome-app
或者
$ nest n my-awesome-app

初始化完成之后,需要创建模块,控制器等,除了手动创建,可以直接用命令的方式创建,以下是常用的创建的命令:

class (简写: cl) 类
controller (简写: co) 控制器
decorator (简写: d) 装饰器
exception (简写: e) 异常捕获
filter (简写: f) 过滤器
gateway (简写: ga) 网关
guard (简写: gu) 守卫
interceptor (简写: i) 拦截器
middleware (简写: mi) 中间件
module (简写: mo) 模块
pipe (简写: pi) 管道
provider (简写: pr) 供应商
service (简写: s) 服务

例如创建一个car的module,可以使用nest g mo car

了解了框架的基本内容之后,就可以连接数据库进行CURD练习上手了。

这里用的是Mysql,先安装基本包:

npm install --save @nestjs/typeorm typeorm mysql

这里用typeorm基本数据库操作,如对typeorm不熟悉可以点击这里了解:typeorm

安装完之后在app.module.ts中设置数据库

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { PhotoModule } from './photo/photo.module'; @Module({
imports: [
TypeOrmModule.forRoot({
type: 'mysql',
host: 'localhost',
port: 3306,
username: 'root',
password: 'root',
database: 'test',
entities: [__dirname + '/**/*.entity{.ts,.js}'],
synchronize: true,
}),
PhotoModule
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}

为方便,这里直接用安装typeorm时生成的photo文件demo从数据库中进行增删改查,使用时先将photo.module.ts在app.module.ts中先注册下。

photo.controller.ts内容如下

import { Controller, Get, Post, Param, Body } from '@nestjs/common';
import { PhotoService } from './photo.service';
import { Photo } from './photo.entity'; @Controller()
export class PhotoController {
constructor(private readonly photoService: PhotoService) {} @Get('photo')
findAll(): Promise<Photo[]> {
return this.photoService.findAll();
} @Post('photo/create')
create(@Body() params) {
return this.photoService.create(params);
}
}

photo.service.ts内容如下:

import { Injectable, Inject } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Photo } from './photo.entity'; @Injectable()
export class PhotoService {
constructor(
@InjectRepository(Photo)
private readonly photoRepository: Repository<Photo>,
) {} async findAll(): Promise<Photo[]> {
return await this.photoRepository.find();
} async create(params) {
   // 增加一条数据
let photo = new Photo();
photo.name = params.name;
photo.description = params.description;
photo.filename = params.filename;
photo.views = params.views;
photo.isPublished = params.isPublished; return this.photoRepository.save(photo)
.then(res => {
return this.findAll();
})
.catch(err => {
return err;
})
}
}

然后打开postman工具模拟post请求:

可以看到成功插入并返回数据,去数据库中再看下:

其他更新,删除操作也同理。。。

基本入门完毕~

初识nest.js的更多相关文章

  1. 初识node.js(通过npm下载项目依赖的包的过程)

    一.初识node.js 简单的说Node.js 就是运行在服务器端的JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事 ...

  2. [Next] Next.js+Nest.js实现GitHub第三方登录

    GitHub OAuth 第三方登录 第三方登录的关键知识点就是 OAuth2.0 . 第三方登录,实质就是 OAuth 授权 . OAuth 是一个开放标准,允许用户让第三方应用访问某一个网站的资源 ...

  3. [Nest] 01.初见nest.js

    github nest 介绍 Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架.它使用渐进式 JavaScript,内置并完全支持 TypeScript(但仍然允许开发人 ...

  4. 在 Nest.js 中使用 MongoDB 与 TypeORM

    在 Nest.js 中使用 MongoDB 与 TypeORM 首先要在 database 文件夹里建立DatabaseModule模块文件, // database/database.module. ...

  5. Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   Nest.js 6.0.0 正式版发布了.Nest 是构建高效.可扩展的 Node.js Web 应用程序的框架.它使用现代的 JavaSc ...

  6. nest.js tutorials

    nest.js tutorials A progressive Node.js framework https://docs.nestjs.com//firststeps nest.js CLI ht ...

  7. Nest.js你学不会系列-初识Nest

    前言 最近在学习研究 Nest 框架,但是在学习过程中除了参考翻阅官方文档外国内几乎没有多少资料能系统的讲解 Nest 的相关内容,所以打算想通过我自己学习的角度讲解下 Nest 框架,不知道能坚持多 ...

  8. Nest.js WebSocket

    Docs: https://docs.nestjs.com/websockets/gateways λ yarn add @nestjs/websockets λ nest g ga events e ...

  9. 第1章-初识Vue.js

    一.初识Vue 1.1.本次我们学习的内容 常用指令:vue中最基础的内容 交互: 网络请求 组件: 是vue.js 这个框架 最核心,最精华的内容,因为vue呐,它在所有的框架中是把组件化做到了极致 ...

随机推荐

  1. Tomcat和Servlet简析

    目录 Servlet Tomcat 参考 Servlet Servlet通常指我们继承了Servlet接口的类,我们开发Servlet时一般就是继承HttpServlet重写它的doGet.doPos ...

  2. [zebra源码]分片语句ShardPreparedStatement执行过程

    主要过程包括: 分库分表的路由定位 sql语句的 ast 抽象语法树的解析 通过自定义 SQLASTVisitor (MySQLSelectASTVisitor) 遍历sql ast,解析出逻辑表名 ...

  3. 「CF521D」 Shop

    「CF521D」 Shop 传送门 题目说是有三种操作,首先可以知道赋值操作是可以转化为加法操作的,即 \((1,b) \rightarrow (2,b-a_i)\) 然后加法对于一个数你肯定优先选择 ...

  4. DWA局部路径规划算法论文阅读:The Dynamic Window Approach to Collision Avoidance。

    DWA(动态窗口)算法是用于局部路径规划的算法,已经在ROS中实现,在move_base堆栈中:http://wiki.ros.org/dwa_local_planner DWA算法第一次提出应该是1 ...

  5. WLS中Linux与Windows间的环境共享

    Reference 更多cmd.exe帮助参考 (cmd_helps)[https://ss64.com/nt/cmd.html] (WSL备份,windows Docker安装)[https://w ...

  6. java 向Redis中存放数据 List<Device>转String

    /** * redis服务 */ @Autowired private RedisService redisService; //创建 Device  对象 Device no = new Devic ...

  7. java实现自动静默打印功能

    ​ 最近接到一个需求,要求实现自动打印功能,一般网页打印pdf需要借助浏览器的pdf组件,而且还要弹出打印窗口,再点击打印才能实现. 那么如何实现自动打印了,从点击自己网页上3次缩减到点击一次了? 一 ...

  8. Deepin V20.1 解决安装Edge浏览器后更新系统报错的方法

    问题描述:有些人在deepin系统上安装完edge浏览器后采用sudo apt update命令更新系统,却报出了错误,更新失败.原因是更新deepin系统的时候,最好把其它的源禁用了,不然会有各样的 ...

  9. C++第四十九篇 -- 将一个项目Copy到另一台电脑

    最近写项目,由于设备原因,需要将一台电脑的项目拷贝到另一台电脑上,在另一个电脑上继续编写.由于配置属性原因,最终还是在另一台电脑上创建了新项目,只是把这些cpp文件都复制过去了,然后重新部署属性. 背 ...

  10. infomation_schema基本使用

    一.infomation_schema库 把 information_schema 看作是一个数据库,确切说是信息数据库.其中保存着关于MySQL服务器所维护的所有其他数据库的信息.如数据库名,数据库 ...