基础-1

  1. Nest是一个渐进式的Node框架,可以在TypeScriptJavaScript(ES6、ES7、ES8)之上构建高效、可伸缩的企业级服务端应用程序;
  2. Nest基于TypeScritp编写、并结合使用OOP(面向对象编程)FP(函数式编程)ERP(函数式响应编程)的相关理念;
  3. Nest的设计灵感很多来自于Angular,而Angular的很多模式又来自于JavaSpring框架,诸如AOP(面向切片编程)、依赖注入、控制反转等等,所以NestNode版的Spring框架!
  4. Nest底层HTTP平台默认基于Express实现的,所以无需担心第三方库的缺失;技术上讲,Nest可以在创建适配器后使用任何Node Http框架,但它提供了两个开箱即用的HTTP平台:Express、Fastify
  5. Nest的核心思想:提供一个层与层之间的耦合度极小、抽象化极高的架构体系。

环境搭建

  1. 脚手架:npm i -g @nestjs/cli yarn global add @nestjs/di
  2. 创建项目:nest new project-name
  3. 运行项目:npm run start
  4. 热重载运行:npm run start:dev
nest结构.png

控制器

  1. 控制器层负责处理用户的请求,并做出响应;
    Client ---> Controller-1、Controller-2、Controller-3
  1. 创建控制器:nest g controller xxx
    1. src目录中生成xxx目录,其中包含xxx.controller.ts
    2. 控制器是一个装饰了Controller的类,xxx生成对应的@Controller('xxx')
    3. 同时在根模块app.module.ts中,引入了此控制器:controllers:[AppController, XxxController]
  2. @Get装饰器处理Get请求
    @Controller('xxx')
    export class XxxController {
        @Get()   // http://localhost:3000/xxx
        index() {
            return 'hello xxx'
        }
        @Get('add')   // http://localhost:3000/xxx/add
        add() {
            return 'hello xxx add'
        }
    }
    
    1. 处理Get传参:@Query
        @Get('add')   // http://localhost:3000/xxx/add?id=123&name=Jack
        add(@Query() query) {    // { id: 123, name: Jack }
            return 'hello xxx add'
        }
        
        @Get('add')
        add(@Query('id') id) {    // 指定只获取某一个参数
            return id   // 123
        }
    
    1. @Request也可以处理Get参数,类似于Express平台的Request,包含有请求的完整信息。
        @Get('add')   // http://localhost:3000/xxx/add?id=123&name=Jack
        add(@Request() req) {
            return req.query   // { id: 123, name: Jack }
        }
    
  3. @Post装饰器处理Post请求
        @Post('create')
        create() {
            return 'hello xxx create'
        }
    
    1. @Body处理Post参数
        @Post('create')
        create(@Body() body) {
            return 'hello xxx create'
        }
    
    1. @Body也可以指定只获取某一个参数:@Body('key')
  4. @Param处理动态路由的参数
        @Get(':id')   // http://localhost:3000/xxx/111
        show(@Param() param) {
            console.log(param)    // { id: 111 }
            return 'hello xxx'
        }
    
        @Get(':id')
        show(@Param('id') id) {   // 指定只获取 id
            return id  // 111
        }
    
  5. 模糊匹配,如 * 表示匹配 n(n>=0) 个字符
        @Get('a*a')   // http://localhost:3000/xxx/adda
        add() {
            return 'hello xxx add'
        }
    
  6. @Headers(name?: string):获取请求头;@Redirect:重定向;
  7. @Response():响应对象的装饰器。控制器方法不能再通过 return 响应数据,而是使用 Response 对象自身的方法。
    @Get()
    admin(@Response() res) {
        res.redirect('/user');  //重定向
    }
    
    @Get('add')
    add(@Response() res) {
        res.send({ msg: 'success' });  //响应数据
    }
    

配置静态资源

  1. 静态资源配置依赖所使用的平台,以Express平台为例
  2. main.ts
        import { NestExpressApplication } from '@nestjs/platform-express';
        async function bootstrap() {
            // 通过泛型指定使用的平台Express
            const app = await NestFactory.create<NestExpressApplication>(AppModule);
            //配置静态资源的目录:根目录/public
            app.useStaticAssets('public');
            await app.listen(3000);
        }
    
  3. public目录中的静态资源可以直接访问:http://localhost:3000/logo.png
  4. 还可以配置虚拟目录
        app.useStaticAssets('public', { prefix: '/static/' });
        //访问:http://localhost:3000/static/logo.png
    

配置模板引擎

  1. ejs 为例:npm i ejs --save
  2. main.ts:配置视图文件的目录,指定使用的模板引擎;
        app.setBaseViewsDir('views');  // 根目录/views
        app.setViewEngine('ejs');
    
  3. 创建视图 views/admin/index.ejs
        <h2>姓名:<%= name%></h2>
        <h2>年龄:<%= age%></h2>
    
  4. 在控制器中渲染并响应视图
        @Get()
        @Render('admin/index')
        admin() {
            return { name: 'Mack', age: 20 }  //向模板中传递数据
        }
    

服务

  1. Nestjs中的服务可以是service,也可以是provider,可以通过constructor注入依赖关系;
  2. 服务本质上就是通过 @Injectable() 装饰的类,在Nestjs中,服务相当于MVC的Model
  3. 创建服务
    nest g service xxx
    
    1. 生成xxx/xxx.service.ts
        import {Injectable} from '@nestjs/common'
        @Injectable()
        export class XxxService {
            find() {
                return {name: 'Jack', age: 20};
            }
        }
    
    1. 根模块app.module.ts中,自动引入服务
        providers: [AppService, XxxService]
    
    1. 在需要使用的地方注入服务对象
        nest g controller xxx   //创建控制器
    
        @Controller('xxx')
        export class XxxController {
            //依赖注入
            constructor(private service: XxxService) { }
            @Get()
            index() {
                return this.service.find();
            }
        }
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容