返回顶部
首页 > 资讯 > 精选 >Node.js模块Modules如何使用
  • 926
分享到

Node.js模块Modules如何使用

2023-07-06 03:07:30 926人浏览 八月长安
摘要

本篇内容介绍了“node.js模块Modules如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!模块模块就是一个声明了装饰器@Modu

本篇内容介绍了“node.js模块Modules如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

模块

模块就是一个声明了装饰器@Module()的类。装饰器@Module()提供了元数据,以便让Nest组织应用程序结构。

Node.js模块Modules如何使用

每个应用程序至少有一个模块,即根模块。根模块是 Nest 用来构建应用程序图的起点,应用程序图是 Nest 用来解析模块和提供者关系和依赖关系的内部数据结构。虽然非常小的应用程序理论上可能只有根模块,但这不是典型情况。我们想强调的是,强烈建议将模块作为组织组件的有效方法。因此,对于大多数应用程序,生成的体系结构将使用多个模块,每个模块封装一组密切相关的功能。

@Module()装饰器采用单个对象,其属性描述如下:

providers由 Nest 注入器实例化的提供者,并且可以至少在整个模块中共享
controllers必须创建的一组控制器
imports导入模块的列表,这些模块导出了此模块中所需提供者
exports由本模块提供并应在其他模块中可用的提供者的子集。

默认情况下,模块封装providers。这意味着无法注入既不是当前模块的直接组成部分,也不是从导入的模块导出的providers。因此,您可以将模块中导出的providers视为模块的公共接口或 api

功能模块

CatsControllerCatsService属于同一应用程序域。由于它们密切相关,因此将它们移动到功能模块中是有意义的。功能模块只是组织与特定功能相关的代码,保持代码井井有条并建立清晰的边界。这有助于我们管理复杂性并使用SOLID原则进行开发,尤其是随着应用程序或团队规模的增长的时候。

为了演示这一点,我们将创建CatsModule

import { Module } from "@nestjs/common";import { CatsController } from "./cats.controller";import { CatsService } from "./cats.service";@Module({  controllers: [CatsController],  providers: [CatsService],})export class CatsModule {}

使用 CLI 创建模块,只需执行$ nest g module cats命令即可。

以上,我们已经创建了cats.module.ts文件,并把与这个模块相关的所有东西都移到了cats目录下。我们需要做的最后一件事是将这个模块导入根模块 (根模块AppModule, 已经定义在app.module.ts文件内)。

import { Module } from "@nestjs/common";import { CatsModule } from "./cats/cats.module";@Module({  imports: [CatsModule],})export class AppModule {}

目录结构如下:

src
├──cats
│    ├──dto
│    │   └──create-cat.dto.ts
│    ├──interfaces
│    │     └──cat.interface.ts
│    ├─cats.service.ts
│    ├─cats.controller.ts
│    └──cats.module.ts
├──app.module.ts
└──main.ts

共享模块

在 Nest 中,默认情况下,模块是单例的,因此你可以轻松地在多个模块之间共享同一个提供者实例。

Node.js模块Modules如何使用

实际上,每个模块都是一个共享模块,一旦创建就能被任意模块重复使用。假设我们要在几个模块之间共享CatsService实例,则需要把CatsService放到模块CatsModuleexports数组中,如下所示:

import { Module } from "@nestjs/common";import { CatsController } from "./cats.controller";import { CatsService } from "./cats.service";@Module({  controllers: [CatsController],  providers: [CatsService],  exports: [CatsService],})export class CatsModule {}

现在,任何导入CatsModule的模块都可以访问CatsService,并将与导入CatsModule的所有其他模块共享相同的实例。

模块重新导出

如上所示,模块可以导出其内部提供者程序。此外,他们可以重新导出导入的模块。在下面的示例中,CommonModule既可导入,又从CoreModule导出,使其可用于导入此模块的其他模块。

@Module({  imports: [CommonModule],  exports: [CommonModule],})export class CoreModule {}

依赖注入

模块类也可以注入提供者程序(例如,出于配置目的):

import { Module } from '@nestjs/common';import { CatsController } from './cats.controller';import { CatsService } from './cats.service';@Module({  controllers: [CatsController],  providers: [CatsService],})export class CatsModule {  constructor(private catsService: CatsService) {}}

但是,由于[循环依赖性],模块类不能注入到提供者中。

Global modules

如果您必须在任何地方导入同一组模块,则可能会变得乏味。与 Nest 不同,angular提供者在全局范围内注册。定义后,它们随处可用。但是,Nest 将提供程序封装在模块范围内。如果不先导入封装模块,则无法在其他地方使用模块的提供程序。

当您想要提供一组开箱即用的提供程序(例如,帮助程序、数据库连接等)时,请使用@Global() 装饰器使模块全局化。

import { Module, Global } from "@nestjs/common";import { CatsController } from "./cats.controller";import { CatsService } from "./cats.service";@Global()@Module({  controllers: [CatsController],  providers: [CatsService],  exports: [CatsService],})export class CatsModule {}

@Global() 装饰器使模块全局可用。全局模块应仅注册一次,通常由根模块或核心模块注册。在上面的例子中,CatsService提供程序将无处不在,希望注入服务的模块不需要在其导入数组中导入CatsModule

让所有的模块都成为全局模块不是一个好的设计决策。全局模块可用于减少必要的样板数量。imports 通常是使模块的 API 可供使用者使用的首选方式。

动态模块

Nest 模块系统包括一个强大的功能,称为动态模块。此功能使您能够轻松创建可动态注册和配置提供程序的可自定义模块。动态模块详细介绍[点这里(/fundamentals/dynamic-modules)]。在本章中,我们将简要概述以完成模块的介绍。

下面是DatabaseModule的动态模块定义示例:

import { Module, DynamicModule } from "@nestjs/common";import { createDatabaseProviders } from "./database.providers";import { Connection } from "./connection.provider";@Module({  providers: [Connection],})export class DatabaseModule {  static forRoot(entities = [], options?): DynamicModule {    const providers = createDatabaseProviders(options, entities);    return {      module: DatabaseModule,      providers: providers,      exports: providers,    };  }}

forRoot()方法可以同步或异步返回动态模块(即通过Promise)。

模块DatabaseModule在装饰器@Module()中定义了一个Connection的提供者,但是此模块的返回值还要看forRoot()方法,它返回了一系列的提供者,例如 repositories。所以,请注意动态模块的返回值是扩展了装饰器@Module()定义,而不是覆盖。所以模块DatabaseModule导出的providers,包含两部分,一部分是静态定义的Connection,另外一部分是forRoot()方法动态生成的 providers。

如果你想注册一个全局的动态模块,设置global=true即可。

{  global: true,  module: DatabaseModule,  providers: providers,  exports: providers,}

使所有的模块都成为全局模块,不是一个好的设计策略。

可以通过以下方式导入和配置DatabaseModule

import { Module } from "@nestjs/common";import { DatabaseModule } from "./database/database.module";import { User } from "./users/entities/user.entity";@Module({  imports: [DatabaseModule.forRoot([User])],})export class AppModule {}

如果你想反过来重新导出动态模块,你可以在exports数组中省略forRoot()方法调用:

import { Module } from "@nestjs/common";import { DatabaseModule } from "./database/database.module";import { User } from "./users/entities/user.entity";@Module({  imports: [DatabaseModule.forRoot([User])],  exports: [DatabaseModule],})export class AppModule {}

node.js模块Modules如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Node.js模块Modules如何使用

本文链接: https://lsjlt.com/news/357600.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Node.js模块Modules如何使用
    本篇内容介绍了“Node.js模块Modules如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!模块模块就是一个声明了装饰器@Modu...
    99+
    2023-07-06
  • Node.js模块Modules的使用实战教程
    目录模块功能模块共享模块模块重新导出依赖注入Global modules动态模块模块 模块就是一个声明了装饰器@Module()的类。装饰器@Module()提供了元数据,以便让Ne...
    99+
    2023-05-15
    Node.js模块 Node.js Modules
  • Node.js中如何使用DNS模块
    Node.js中如何使用DNS模块,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1. DNS在Node.js中,提供DNS模块,以实现域名...
    99+
    2024-04-02
  • Node.js 中domain模块如何使用
    这篇文章给大家介绍Node.js 中domain模块如何使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。异步异常处理异步异常的特点由于node的回调异步特性,无法通过try catc...
    99+
    2024-04-02
  • Node.js中如何使用Cluster模块
    Node.js中如何使用Cluster模块,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.为什么我的应用代码中明明有app....
    99+
    2024-04-02
  • Node.js中如何使用util模块
    本篇文章为大家展示了Node.js中如何使用util模块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。util.inheritsuitl.inherits(cons...
    99+
    2024-04-02
  • Node.js中stream模块如何使用
    Node.js中stream模块如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。什么是stream定义流的英文strea...
    99+
    2024-04-02
  • node.js中如何使用url模块
    本篇文章为大家展示了node.js中如何使用url模块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。引入模块var url = req...
    99+
    2024-04-02
  • Node.js的Process模块如何使用
    这篇文章主要介绍了Node.js的Process模块如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Node.js的Process模块如何使用文章都会有所收获,下面我们一起来看看吧。一、Process模块...
    99+
    2023-07-02
  • Node.js中fs模块如何使用
    这篇文章主要介绍“Node.js中fs模块如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Node.js中fs模块如何使用”文章能帮助大家解决问题。引入fs模块var fs=requ...
    99+
    2023-07-02
  • Node.js 中如何使用fs与Path模块
    Node.js 中如何使用fs与Path模块,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概述:文件系统模块是一个简单包装的标准 POSIX 文件 I/O 操作方法集。可以...
    99+
    2023-06-20
  • 如何使用C/C++编写node.js原生模块
    这篇文章主要为大家展示了“如何使用C/C++编写node.js原生模块”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用C/C++编写node.js原生模块...
    99+
    2024-04-02
  • Node.js模块与npm包管理器如何使用
    本篇内容主要讲解“Node.js模块与npm包管理器如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js模块与npm包管理器如何使用”吧!require函数作用:在当前模块中加载...
    99+
    2023-06-29
  • 如何理解Node.js模块化
    本篇内容主要讲解“如何理解Node.js模块化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Node.js模块化”吧!正文在Node.js中,内置了两个...
    99+
    2024-04-02
  • Node.js的Buffer模块怎么使用
    这篇文章主要介绍“Node.js的Buffer模块怎么使用”,在日常操作中,相信很多人在Node.js的Buffer模块怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • Node.js的Events模块怎么使用
    本篇内容主要讲解“Node.js的Events模块怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js的Events模块怎么使用”吧!Event...
    99+
    2024-04-02
  • Node.js中SerialPort模块怎么使用
    这篇文章主要讲解了“Node.js中SerialPort模块怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Node.js中SerialPort模块怎么使用”吧!目的上位机与各种电路模...
    99+
    2023-06-21
  • Node.js中SerialPort(串口)模块使用
    目录目的模块安装基础使用扫描端口打开端口发送数据接收数据错误处理数据解析器SerialPort类构造方法属性事件方法命令行工具总结目的 上位机与各种电路模块间常常采用串口进行通讯,N...
    99+
    2024-04-02
  • 如何理解node.js中Util模块作用
    这篇文章给大家介绍如何理解node.js中Util模块作用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。从类型判断说起在 JavaScript 中,进行变量的类型校验是一个非常令人头疼的事,如果只是简单的使用 ...
    99+
    2023-06-21
  • Node.js基础入门之path模块,url模块,http模块使用详解
    目录path模块1. path模块示例2. path模块其他方法url模块1. 旧的解析方法2. 新的解析方法http模块1. 什么是HTTP协议?2. HTTP协议约束的细节3. ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作