简介 Nest 是一个用于构建高效,可扩展的 Node.js 服务器端应用程序的框架。在底层,Nest 使用强大的 HTTP Server 框架,如 Express(默认)和 Fastify。...已经了解的朋友可以跳过~ 装饰器 装饰器(Decorator)是一种与类(class)相关的语法,用来注释或修改类和类方法。它是一种函数,写成@ + 函数名的形式。...他们都可以通过构造函数注入依赖关系,也就是说,他们之间可以创建各种关系。而提供者只不过是一个用 @Injectable() 装饰器的简单类。...但是 Nest 将提供者封装在模块范围内,如果不导入模块,就无法在其他地方使用他们导出的提供者。...Nest 中间件可以是一个函数,也可以是一个带有 @Injectable() 装饰器的类,且该类应该实现 NestMiddleware 接口,而函数没有任何特殊要求。
用 NodeJS, Express, MongoDB 和 TypeScript 设计 API 启动 创建 Todo 类型 创建 Todo 模块 创建 API 控制器 获取、新增、更新和删除 Todo 创建...但如果你想,你也可以坚持使用本地安装使用的方式。 现在,让我们在终端上执行以下命令来安装 TypeScript。...yarn add -D @types/node @types/express @types/mongoose @types/cors 现在,TypeScript 不会再对你提示错误——它将使用这些类型来定义我们刚刚安装的库...因为我们已经创建了函数,所以唯一要做的就是导入这些方法并将它们作为参数传递。 到目前为止,我们已经谈了很多,但是仍然没有启动服务器。所以,我们在下一节中解决这个问题。...最后,我们使用 TypeScript、React、NodeJs、Express 和 MongoDB 完成了一个 Todo 应用程序的构建。 附上源代码。 谢谢阅读!
定义不同类型和内容的消息回复规则,并调用相关接口或数据库。 创建一个模块(Module),组织控制器和服务,并导出给其他模块使用。...NestJS框架支持多种常用技术栈,如TypeScript、GraphQL、MongoDB等,让你可以根据需求选择合适的工具。.../weixin.service' // 使用 Controller 装饰器标记这个类为一个控制器,并指定路由前缀为 'weixin' @Controller('weixin') // 定义一个名为 WeixinController...的类,用于处理微信相关的请求 export class WeixinController { // 定义一个私有属性 weixinService,用于注入 WeixinService 服务类的实例...private weixinService: WeixinService // 定义一个构造函数,接收 weixinService 参数,并赋值给 this.weixinService 属性
2.使用全局错误处理 我们可以使用 NodeJS 全局错误处理功能,而不是在每个控制器上构建错误响应。 首先,创建一个派生自内置 Error 类的自定义 AppError 类。...此自定义类允许您使用 statusCode 和 status 等附加属性来自定义错误对象。...3.使用自定义Try-Catch函数 我们可以使用实现相同目的的自定义函数,而不是使用 try-catch 块手动包装每个控制器函数。...tryCatchFn 包装控制器函数,您可以确保自动捕获这些函数中引发的任何错误并将其传递给全局错误处理程序,从而无需单独添加 try-catch 块。...使用 Express 开发 NodeJS 应用程序时,通常有一个包含所有业务逻辑、路由定义和服务器设置的主文件。 然而,随着应用程序的增长,管理和维护处理所有事情的单个文件可能会变得困难。
它利用 JavaScript 的渐进增强的能力,使用并完全支持 TypeScript (仍然允许开发者使用纯 JavaScript 进行开发),并结合了 OOP (面向对象编程)、FP (函数式编程)和...: app.controller.ts 带有单个路由的基本控制器示例。...@module() 装饰器接受一个描述模块属性的对象: providers 由 Nest 注入器实例化的提供者,并且可以至少在整个模块中共享 controllers 必须创建的一组控制器 imports...,如果不传递参数,必须返回一个空对象 } } Cookie的使用 cookie和session的使用依赖于当前使用的平台,如:express和fastify 两种的使用方式不同,这里主要记录基于express...设置cookie的时候配置signed属性 res.cookie('userinfo','hahaha',{domain:'.ccc.com',maxAge:900000,httpOnly:true,
前情概要 上篇文章把action的注册讲完了,但是我们的处理函数没有指定可接受的httpmethod,也没有别名上面的。下面我们使用typescript的特性之一装饰器来实现一把这个特性。...在控制器和处理函数的注册篇中有说到的第三,第四个参数就在这里排上用场拉。...action的某些属性进行重写。..._1 = require("gd-express-basic"); class HostController extends gd_express_basic_1.BaseController {...__decorate函数,__decorate函数内可以简单理解为调用我们的声明的装饰器函数返回的闭包函数。
本文主要帮助理解 TypeScript 中的高级类型及工具类型。在实际使用 TypeScript 的开发过程中,得益于这些高级类型于工具类型,我们可以更方便的构建出我们需要的类型。...它通常配合一组尖括号进行声明使用: // 一个带有 name 属性的类型 type Cup = { name: string; }; // 声明一个接收三个参数的函数, // 第一个参数是必须拥有name...属性的 object // 第二个参数设置为第一个参数这个对象中的一个属性 // 第三个参数设置为第二个参数的属性值 const addAttr = <T extends {name: string},...T 设置到属性 k 上。...,使用剩余属性构造一个新类型 // type Exclude = T extends U ?
构造器 类的构造器和函数很像,你可以给它的参数添加类型注解,可以使用参数默认值或者是函数重载: class Point { x: number; y: number; // 使用了参数默认值的正常签名...同理,实现一个带有可选属性的接口,并不会创建该属性: interface A { x: number; y?...因为类本身也是一个可以通过 new 调用的函数,所以无法使用一些特定的静态成员名字。...诸如 name、length 和 call 这样的函数属性无法作为静态成员的名字: class S { static name = 'S!'...,即使对于那些没有使用 TypeScript 进行检查的代码也是如此 这样会占用更多内存,因为以这种方式定义的函数,会导致每个类实例都有一份函数副本 你无法在派生类中使用 super.getName,因为在原型链上没有入口可以去获取基类的方法
最后一行,我们使用 new 构造了 Greeter 类的一个实例。它会调用之前定义的构造函数,创建一个 Greeter 类型的新对象,并执行构造函数初始化它。...与前一个例子的不同点是,派生类包含了一个构造函数,它 必须调用 super(),它会执行基类的构造函数。而且,在构造函数里访问 this 的属性之前,我们 一定要调用 super()。...readonly 修饰符 你可以使用 readonly 关键字将属性设置为只读的。只读属性必须在声明时或构造函数里被初始化。...高级技巧 构造函数 当你在 TypeScript 里声明了一个类的时候,实际上同时声明了很多东西。...把类当做接口使用 如上一节里所讲的,类定义会创建两个东西:类的实例类型和一个构造函数。因为类可以创建出类型,所以你能够在允许使用接口的地方使用类。
控制器的作用 控制器层负责处理传入的请求, 并返回对客户端的响应。 ? 为了创建一个基本的控制器,我们必须将元数据附加到类中。Nest 知道如何映射我们的控制器到相应的路由。...控制器的定义 下面我们来定义一个 UsersController 控制器,如果使用 Nest CLI 的话,可以在命令行执行以下命令: $ nest generate controller users...现在我们来简单总结一下,在 Nest.js 中自定义控制器的流程: 创建新的控制器类; 使用 @Controller 装饰器装饰新的类; 在相应的模块中注册新建的控制器。...DTO 是一个定义如何通过网络发送数据的对象。我们可以使用 TypeScript 接口或简单的类来定义对象。但是我们建议在这里使用类。这是为什么呢?...因为类是 JavaScript ES6 标准的一部分,它们只是简单的函数。然而 TypeScript 定义的接口在编译过程中会被移除,导致 Nest 不能引用它们。
IOC容器中,然后由IOC容器来控制类的实例化过程,当构造函数需要使用其他类的实例时,IOC容器会自动完成对依赖的分析,生成需要的实例并将它们注入到构造函数中,当然需要以单例模式来使用的实例都会保存在缓存中...,它需要一个工厂方法、一个标记是否为单例的属性以及指向单例的指针,接下来我们在IOC容器类上添加用于注册构造函数的方法bind: // 构造函数泛型 interface iClass { new...,初学者可能会对iClass接口的声明比较陌生,它是指实现了这个接口的实体在被new时需要返回预设类型T的实例,换句话说就是这里接收的是一个构造函数,new( )作为接口的属性时也被称为“构造器字面量”...return Promise.reject(error); }); 如果你了解过express和koa框架中所使用的中间件模型,就很容易意识到这里的拦截器机制本质上和它们是一样的,用户自定义的处理函数被依次添加进拦截器数组...在方法装饰器的函数体中,我们可以从构造函数或原型对象上获取到需要被装饰的方法,接着用代理模式生成一个带有附加功能的新方法,并在恰当的时机执行原方法,最后通过直接赋值或是利用属性描述符中的getter返回包装后的新方法
我们可以通过访问对象的属性和方法来获取和操作相应的数据。使用构造函数除了对象字面量,我们还可以使用构造函数来创建对象。构造函数是一种特殊的函数,用于创建和初始化对象。...在 TypeScript 中,我们可以使用 new 关键字结合构造函数来创建对象。...以下是一个使用构造函数创建对象的示例:class Person { name: string; age: number; constructor(name: string, age: number...然后,通过使用 new 关键字和构造函数来创建 person 对象。访问对象的属性和方法点符号访问在 TypeScript 中,我们可以使用点符号 . 来访问对象的属性和方法。...总结本文详细介绍了 TypeScript 中对象的概念、创建和使用对象的方法。我们学习了如何使用对象字面量和构造函数来创建对象,以及如何访问对象的属性和方法。
例如,定义一个类装饰器 function Contorller (target) { // 可以通过target(类的构造函数)去做些事情 } 使用类装饰器 @Contorller clss...参数装饰器表达式会在运行时当作函数被调用,它有三个参数: 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。 参数的名字。 参数在函数参数列表中的索引。...注意:属性描述符不会做为参数传入属性装饰器,这与TypeScript是如何初始化属性装饰器的有关。因为目前没有办法在定义一个原型对象的成员时描述一个实例属性,并且没办法监视或修改一个属性的初始化方法。...因此,属性描述符只能用来监视类中是否声明了某个名字的属性。 属性装饰器表达式会在运行时当作函数被调用,它有两个参数: 对于静态属性来说是类的构造函数,对于原型属性来说是类的原型对象。 属性的名字。...首先,在AdminContorller中,我们在getData方法声明前使用了get和use两个装饰器,这两个装饰器承担的任务分别是设置接口路径,给接口使用的中间件。
TypeScript 除了实现了所有 ES6 中的类的功能以外,还添加了一些新的用法。 这一节主要介绍类的用法,下一节再介绍如何定义类的类型。...属性和方法§ 使用 class 定义类,使用 constructor 定义构造函数。 通过 new 生成新实例的时候,会自动调用构造函数。...§ 使用 extends 关键字实现继承,子类中使用 super 关键字来调用父类的构造函数和方法。...实例属性§ ES6 中实例的属性只能通过构造函数中的 this.xxx 来定义,ES7 提案中可以直接在类里面定义: class Animal { name = 'Jack'; constructor...参数属性§ 修饰符和readonly还可以使用在构造函数参数中,等同于类中定义该属性同时给该属性赋值,使代码更简洁。
npm 的基本使用,可以参考这篇教程[6]进行学习 TypeScript 基础知识,只需了解简单的类型注解就可以了,可以参考我们的 TypeScript 系列教程[7] *(非必须)*Express...❞ 中间件的第二个参数便是 next 函数,这个熟悉 Express 的同学一定知道它是干什么的:用来把控制权转交给下一个中间件。...但是它跟 Express 的 next 函数本质的区别在于,「Koa 的 「「next」」 函数返回的是一个 Promise」,在这个 Promise 进入完成状态(Fulfilled)后,就会去执行中间件中第二阶段的代码...并且,由于我们使用了 TypeScript 开发,因此这里使用为 TS 量身打造的 ORM[12] 库 TypeORM。...这里我们使用了三个装饰器: Entity 用于装饰整个类,使其变成一个数据库模型 Column 用于装饰类的某个属性,使其对应于数据库表中的一列,可提供一系列选项参数,例如我们给 password 设置了
项目地址:TypeScript-Doc-Zh,如果对你有帮助,可以点一个 star ~ 本章节官方文档地址:The Basics 基础 欢迎来到手册的第一章节。...这就是上面的代码会抛出 TypeError 的原因 —— 它表明字符串 "Hello World!" 无法作为函数被调用。...举个例子,看下面的函数: function fn(x){ return x.flip() } 复制代码 从代码可以看出,仅当存在一个带有 flip 属性的对象时,这个函数才可以正常运行,但 JavaScript...那么不妨我们改用一种方案,使用一个静态的类型系统,在代码实际执行前预测代码的行为。 静态类型检查 还记得之前我们将字符串作为函数调用时,抛出的 TypeError 错误吗?...TypeScript 有几个和类型检查相关的严格性设置,它们可以随时打开或关闭,如若没有特殊说明,我们文档中的例子都是在开启所有严格性设置的情况下执行的。
它使用渐进式JavaScript,使用TypeScript构建并完全支持TypeScript(但仍然允许开发人员使用纯JavaScript编码),并结合了OOP(面向对象编程)、FP(功能编程)和FRP...注入并使用 将 OrdersService 通过构造函数注入到 OrdersController 控制器,这样就得到了初始化后的 ordersService 成员,接着就可以在不同的处理函数调用服务中提供的能力...,还可以选择使用装饰器对 Class 的属性进行表述来实现基于 Class 的验证。...(如上例中的 useGlobalPipes())无法注入依赖,因为绑定是在任何模块的上下文之外完成的。...为了解决这个问题,你可以使用以下构造设置全局管道 直接从任何模块 import { Module } from '@nestjs/common'; import { APP_PIPE } from '@
当 TypeScript 首次引入索引签名时,你只能使用“中括号”的元素访问语法(如 person["name"])来获得它们声明的属性。...; } } 为了简化这类场景的操作,前不久 TypeScript 在类型带有一个字符串索引签名时加入了“点”属性访问语法(例如 person.name)。...在这种模式下,你将选择使用 TypeScript 的旧款行为,跳出一个错误。这个新设置不受 strict 标志族的限制,因为我们相信用户会发现它在某些代码库上更好用。...这并不会阻止你传递其他“具体”的类 / 构造函数——它实际上只是表明没有意图直接运行构造函数,因此可以安全地传递任何一种类类型。 这个特性允许我们以支持抽象类的方式编写 mixin 工厂。...很明显,movieWatchCount 中肯定不存在某些字符串,但由于存在 undefined,以前版本的 TypeScript 仍将可选对象属性视为无法分配给其他兼容的索引签名。
第七节:引用类型-数组 TypeScript中的数据分为值类型和引用类型。引用类型中封装了很多对属性,每一对属性都有属性名和属性值。...那么,我们在创建数组的时候也可以使用构造函数来进行赋值。...创建日期对象 日期对象是Date的实例,可以使用构造函数的方法进行创建。并且构造函数中可以传递多种类型的参数。...constructor为构造函数。构造函数的主要作用是给类中封装的属性进行赋值。...使用readonly修饰符将属性设置为只读,只读属性必须在生命时或者构造函数里被初始化(注意)。
compatible 设备节点中对应的节点信息已经被内核构造成struct platform_device。驱动可以通过相应的函数从中提取信息。...dm9000驱动中就是使用下面这个函数通过设备节点中的"compatible"属性提取相应的信息,所以二者的字符串需要严格匹配。...#interrupt-cells,是中断控制器节点的属性,用来标识这个控制器需要几个单位做中断描述符,用来描述子节点中"interrupts"属性使用了父节点中的interrupts属性的具体的哪个值。...-pinctrl.dtsi"(被板级设备树的exynos4412.dtsi包含)中的gpx0节点: 而在gpx0节点中,指定了"#interrupt-cells = ;",所以在dm9000中的属性...,有部分属性很难做到通用,需要驱动自己定义好,通过内核的属性提取解析函数进行值的获取,比如dm9000节点中的下面这句就是自定义的节点属性,用以表示配置EEPROM不可用。
领取专属 10元无门槛券
手把手带您无忧上云