@edifice.io/edifice-nestjs-core

中文文档
1.0.7发布于 2026/11/14AGPL-3.0TypeScriptCommonJS近 30 天下载 3097

Edifice应用软件的核心NestJS模块和公用事业

中文使用文档
文档目录12 节
  1. * 安装
  2. * 特性
  3. 模块
  4. 公用事业
  5. 使用量
  6. 基本设置
  7. CLI 工具
  8. QQ 配置
  9. 环境变量
  10. 发展
  11. 有关软件包
  12. 问题

关于建筑-nestjs-core

  • 许可证: 版权建筑
  • 供资者:
  • 开发者 :

@edicle.io/edicle-nestjs-core (英语)

Edifice应用程序的核心NestJS模块和公用事业.

* 安装

pnpm add @edifice.io/edifice-nestjs-core

* 特性

这个软件包为使用 NestJS 构建 Edifice 后端应用程序提供了必不可少的构件:

模块

  • 应用程序: 申请登记服务
  • 配置: 集中配置管理
  • 数据库: MikroORM 与 PostgreSQL 支持的集成
  • 活动: 数据事件发射器
  • 卫生健康检查终点(准备状态、活性)
  • I18n 时:多种语文支助的国际化服务
  • 锁定器: 与皮诺进行结构化记录(访问日志,请求日志)
  • 海军: NATS 消息客户端集成
  • 权限: 授权警卫和装饰员(ADMC,基于许可)
  • 会议: 会话管理中间软件和装饰器
  • 时间线: 时间线通知服务

申请注册( 申请注册)

这个 AppRegistryService 自动通过 CoreModule。 。 。 .
它在启动时向Edifice App注册处登记您的申请.

此进程扫描所有控制器 @RequirePermission 装饰者,收集所有已声明的工作流程权限,并连同应用程序元数据一起发送给登记册.

如何运作:

  • 在应用靴子上, AppRegistryService.registerApp() 名为.
  • 它通过反射从控制器中提取所有权限 .
  • 它发出一个 AppRegistrationRequestDTO 通过NATS向登记处提交.
  • 登记每10秒重审一次,直至成功.

何时何地:

  • 登记在靴子夹阶段自动进行(见 createApp() 内 bootstrap.utils.ts) (中文(简体) ).
  • 您不需要手动调用; 它是由核心模块所触发的( C)CoreModule) (中文(简体) ).

为什么:

  • 这确保了您的应用及其权限可以被 Edifile 平台发现和管理.
  • 它能够进行集中许可管理和工作流程整合.

示例

import { CoreModule } from '@edifice.io/edifice-nestjs-core';

@Module({
  imports: [CoreModule], // AppRegistryService is included automatically
})
export class AppModule {}

@Controller()
export class ResourceController {
  @Get()
  @RequirePermission('ACCESS')
  async findAll() {
    // This permission will be registered automatically
  }
}

配置( 集中应用程序配置)

这个 ConfigModule 在导入时自动包含 CoreModule 在您的申请.
它为您的 Edifile 后端提供集中配置管理, 使用 NestJS 的 ConfigModule 和辅助环境变量.

特征 :

  • 从环境变量装入配置 .
  • 通过 NestJS 的曝光配置 ConfigService 用于依赖性注射.
  • 为日志,数据库,斯瓦格等模块提供帮助以读取其设置.

如何运作:

  • 应用程序启动时,该配置会从环境变量中加载并在全球注入.
  • 所有模块(数据库、记录器、NATS等)从 ConfigService。 。 。 .
  • 您可以通过设置环境变量来覆盖配置 .

何时何地:

  • 配置系统在应用程序启动时自动初始化 CoreModule。 。 。 .
  • 不需要手动设置; 只需设置所需的环境变量 .

配置 :

  • 使用环境变量设定您的主配置 .
  • 见 src/config/EnvVars.md 用于完整列表支持的变量及其默认值.

示例环境变量:

APP_NAME=my-edifice-app
APP_DISPLAY_NAME=My Edifice App
APP_PREFIX=/api
APP_ICON=https://example.com/icon.png

HOST=0.0.0.0
PORT=3002

DATABASE_URL=postgresql://user:pass@localhost:5432/mydb
DATABASE_USER=user
DATABASE_PASSWORD=pass
DATABASE_SCHEMA=public
DATABASE_DEBUG=true
DATABASE_SSL=false

NATS_URL=nats://localhost:4222
NATS_USER=natsuser
NATS_PASSWORD=natspass
NATS_DEBUG=false

LOG_LEVEL=info
LOG_KEEP_RAW_FIELDS=false

SWAGGER_SERVER_URL=https://api.example.com
HEAP_MEMORY=300
RSS_MEMORY=300

示例

import { Module } from '@nestjs/common';
import { CoreModule } from '@edifice.io/edifice-nestjs-core';
import { ConfigService } from '@nestjs/config';

@Module({
  imports: [CoreModule], // ConfigModule is included automatically
})
export class AppModule {
  constructor(private readonly configService: ConfigService) {
    const appName = this.configService.get<string>('app.name');
    console.log(`App name: ${appName}`);
  }
}

说明:
您不需要手动配置配置系统; 它在导入时可以使用 CoreModule。 。 。 .
所有模块和服务都可以通过依赖性注射进入配置 ConfigService。 。 。 .

额外配置 :

您也可以提供这样的额外配置

import { Module } from '@nestjs/common';
import { configuration as CoreConfig } from '@edifice.io/edifice-nestjs-core';
import AppConfig from './config/configuration'; // Your app's configuration object
import { CoreModule } from '@edifice.io/edifice-nestjs-core';
import { ConfigModule } from '@nestjs/config';

@Module({
  imports: [
    CoreModule,
    // Use config defined in core + app config
    // (warn: does not override core config fields)
    ConfigModule.forRoot({
      isGlobal: true,
      load: [CoreConfig, AppConfig],
    }),
  ],
})
export class AppModule {}

数据库(MikroORM集成)

这个 DatabaseModule 为您的 Edifice 后端应用程序提供与 MikroORM 和 PostgreSQL 的无缝集成.

特征 :

  • 使用 NestJS 自动连接和配置数据库 ConfigModule。 。 。 .
  • 启动时自动运行等待的迁移( 如果在配置中启用) .
  • 提供帮助执行 SQL 脚本并管理 schema 演化.

如何使用 :

  • 导入 DatabaseModule 在您的主要应用模块中( 已经包含在 CoreModule) (中文(简体) ).
  • 通过环境变量配置您的数据库连接( E)DATABASE_URL, (中文(简体) ), DATABASE_USER(见a/c.5/49/70,附件).
  • 将您的迁移脚本放入 sql/ 目录,按照命名惯例:
    • NN-description.sql 用于迁移脚本(例如, 01-init.sql(中文(简体) )
    • NN-rollback.sql 用于回滚脚本(例如, 01-rollback.sql(中文(简体) )
  • 在 ./src/migrations/,各使用帮助器执行相应的 SQL 文件.

示例

  • 在 ./src/migrations/,各使用帮助器执行相应的 SQL 文件.

SQL 迁移脚本(sql/01-init.sql:

-- Create a demo table
CREATE TABLE demo_table (
  id SERIAL PRIMARY KEY,
  name TEXT NOT NULL
);

SQL 回滚脚本(sql/01-rollback.sql:

-- Drop the demo table
DROP TABLE IF EXISTS demo_table;

移民类别(src/migrations/Migration01.ts:

import { Migration } from '@mikro-orm/migrations';
import { executeScript } from '@edifice.io/edifice-nestjs-core';

export class Migration01 extends Migration {
  async up(): Promise<void> {
    await executeScript(this, '01-init.sql');
  }

  async down(): Promise<void> {
    await executeScript(this, '01-rollback.sql');
  }
}

实体定义src/entities/demo.entity.ts:

import { Entity, PrimaryKey, Property } from '@mikro-orm/core';

@Entity()
export class Demo {
  @PrimaryKey()
  id!: number;

  @Property()
  name!: string;
}

使用实体仓库的服务( U)src/demo/demo.service.ts:

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@mikro-orm/nestjs';
import { EntityRepository } from '@mikro-orm/postgresql';
import { Demo } from '../entities/demo.entity';

@Injectable()
export class DemoService {
  constructor(
    @InjectRepository(Demo)
    private readonly demoRepository: EntityRepository<Demo>,
  ) {}

  async createDemo(name: string): Promise<Demo> {
    const demo = this.demoRepository.create({ name });
    await this.demoRepository.persistAndFlush(demo);
    return demo;
  }

  async findAll(): Promise<Demo[]> {
    return this.demoRepository.findAll();
  }
}

演示单元(src/demo/demo.module.ts:

import { Module } from '@nestjs/common';
import { CoreModule } from '@edifice.io/edifice-nestjs-core';
import { DemoService } from './demo.service';
import { Demo } from '../entities/demo.entity';
import { MikroOrmModule } from '@mikro-orm/nestjs';

@Module({
  imports: [CoreModule, MikroOrmModule.forFeature([Demo])],
  providers: [DemoService],
  exports: [DemoService],
})
export class DemoModule {}

说明:

  • 数据库连接参数和迁移行为通过环境变量控制.
  • 该模块确保您的数据库计划符合最新要求,并为高级迁移工作流程提供公用设施.

事件(用户事件跟踪)

这个 EventModule 提供跟踪和记录用户事件(例如访问和创建)的服务.

特征 :

  • 通过NATS将用户事件(ACCESS, CREATE)发布到Edifice事件系统.
  • 从请求中自动提取用户/会话信息.
  • 为移动网络视图请求跳过访问事件 .
  • 集中事件记录用于分析与审计.

如何使用 :

  • 导入 CoreModule 在您的主要应用模块中( 已包含) EventModule) (中文(简体) ).
  • 弹出 EventService 输入您的控制器或服务.
  • 打电话 createAccessEvent(request, resourceType) 或者说 createCreateEvent(request, resourceType) 记录事件.

示例

import { Controller, Get, Post, Req, Injectable } from '@nestjs/common';
import { EventService, CoreModule } from '@edifice.io/edifice-nestjs-core';
import { FastifyRequest } from 'fastify';

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

@Controller()
export class ResourceController {
  constructor(private readonly eventService: EventService) {}

  @Get('/')
  async onResourceAccess(@Req() request: FastifyRequest) {
    await this.eventService.createAccessEvent(request);
  }

  @Post('/')
  async onResourceCreate(@Req() request: FastifyRequest) {
    await this.eventService.createCreateEvent(request, 'RESOURCE_TYPE');
  }
}

配置 :

  • 该模块使用 ConfigService 以获取申请名称( e)app.name) (中文(简体) ).
  • 事件通过NATS客户端发送(EntNatsServiceClient),由核心模块自动配置.

说明:

  • 您不需要手动配置事件系统; 当导入时已准备好使用 CoreModule。 。 。 .
  • 事件有助于分析、审计和工作流程触发.

健康(准备状态和生活检查)

这个 HealthModule 在导入时自动包含 CoreModule 在您的申请.
它为准备和活性检查提供终点和服务,与NestJS Terminus整合.

特征 :

  • 显示 a /health 准备和现场检查的终点.
  • 检查数据库连接(MikroORM),内存使用,以及NATS连接.
  • 通过配置使用内存的自定义阈值 .
  • 与监测和管弦系统相结合(Kubernetes, Docker等).

如何运作:

  • 这个 HealthController 数据库、内存和NATS的汇总检查.
  • 健康指标自动注入和运行.
  • 这个 /health 端点是公开的,可用于探测.

何时何地:

  • 卫生系统在应用程序启动时自动初始化 CoreModule。 。 。 .
  • 不需要手动配置;所有依赖都由核心模块接通.

配置 :

  • 使用环境变量设定内存阈值和其他健康参数:
    HEAP_MEMORY=300
    RSS_MEMORY=300
    
  • 您可以调整这些值以适应您的部署要求 .

示例

import { Module } from '@nestjs/common';
import { CoreModule } from '@edifice.io/edifice-nestjs-core';

@Module({
  imports: [CoreModule], // HealthModule is included automatically
})
export class AppModule {}

说明:
您不需要手动配置健康端点; 当导入时, 健康端点已准备好使用 CoreModule。 。 。 .
健康检查对云母部署和自动监测至关重要.

I18n(国际化服务)

这个 I18nModule 在导入时自动包含 CoreModule 在您的申请.
它提供注册和获取翻译服务,为您的 Edifile 后端提供多种语言支持.

特征 :

  • 启动时为您的应用程序注册翻译文件.
  • 根据请求头动态获取翻译( 语言检测) .
  • 与Edifice ENT客户端整合,进行集中翻译管理.
  • 支持每个语言的自定义翻译文件(例如, assets/i18n/fr.json) (中文(简体) ).
  • 用于其他模块,如通知提供本地化内容.

如何运作:

  • 这个 I18nService 由核心模块初始化并注入.
  • 应用程序启动时, 翻译文件在 assets/i18n/ 自动注册.
  • 您可以使用所提供的服务方法获取当前请求或应用程序的翻译.
  • 通知制度TimelineService 和自定义通知服务) I18nService 将通知内容本地化.

何时何地:

  • I18n系统在应用程序启动时自动初始化 CoreModule。 。 。 .
  • 不需要手动配置;所有依赖都由核心模块接通.

配置 :

  • 申请名称( E)APP_NAME)必须使用环境变量设定.
  • 将您的翻译文件放入 assets/i18n/ 目录(例如, fr.json, (中文(简体) ), en.json) (中文(简体) ).

示例

import { Module, Controller, Get, Req } from '@nestjs/common';
import { CoreModule, I18nService } from '@edifice.io/edifice-nestjs-core';
import { FastifyRequest } from 'fastify';

@Module({
  imports: [CoreModule], // I18nModule is included automatically
})
export class AppModule {}

@Injectable()
export class MyService {
  constructor(private readonly i18nService: I18nService) {}

  async getTranslations(@Req() request: FastifyRequest) {
    return await this.i18nService.fetchCurrentAppTranslationsForRequest(
      request,
    );
  }
}

说明:
默认, FrontendController 暴露一个 /i18n 为您的应用程序提供翻译服务的路径.
没错 没有 需要为i18n创建自定义控制器或路由;它已经由核心模块处理.

Logger (已断接的日志)

这个 LoggerModule 在导入时自动包含 CoreModule 在您的申请.
它使用 Pino 提供结构化的日志,包括访问日志和为您的 Edifice 后端请求日志.

特征 :

  • 对所有请求和应用程序活动进行结构化的JSON记录.
  • 请求范围记录器( E)RequestLogger用于背景日志(用户、路径、方法).
  • 访问登录器( O)AccessLogger用于记录认证和访问活动.
  • 与 NestJS 整合,并支持日志级别,儿童日志和自定义字段.

如何运作:

  • 日志由核心模块初始化并注入.
  • 可以注射吗 RequestLogger 或者说 AccessLogger 输入控制器、服务或中间软件.
  • 日志自动被请求/会话/用户信息所丰富.

何时何地:

  • 在应用程序启动时自动初始化日志 CoreModule。 。 。 .
  • 不需要手动配置;所有依赖都由核心模块接通.

配置 :

  • 使用环境变量设置日志级别和选项 :
    LOG_LEVEL=info
    LOG_KEEP_RAW_FIELDS=false
    
  • 您可以调整这些值以适应您的部署要求 .

示例

import { Module, Controller, Get, Req } from '@nestjs/common';
import { Logger } from 'nestjs-pino';
import { CoreModule } from '@edifice.io/edifice-nestjs-core';
import { FastifyRequest } from 'fastify';

@Module({
  imports: [CoreModule], // LoggerModule is included automatically
})
export class AppModule {}

@Controller()
export class MyController {
  constructor(private readonly logger: Logger) {}

  @Get('hello')
  async hello(@Req() request: FastifyRequest) {
    this.logger.info({ path: request.url }, 'Hello endpoint accessed');
    return { message: 'Hello world' };
  }
}

说明:
您不需要手动配置日志; 它已准备好在导入时使用 CoreModule。 。 。 .
所有日志都是结构化的,可以被日志汇总系统所消耗.

NATS( 中止客户端集成)

这个 NatsModule 在导入时自动包含 CoreModule 在您的申请.
它提供集中的NATS客户端,用于Edifice微服务之间的通讯,服务电话和酒吧/子通信.

特征 :

  • 集中了NATS配置和连接管理.
  • 导出配置的NATS ClientProxy 用于通讯和服务通信.
  • 使用 NestJS 装饰器支持 pub/sub 和请求/响应模式(EventPattern, (中文(简体) ), MessagePattern) (中文(简体) ).
  • 包括一个安全解冻器来优雅地处理非JSON消息.
  • 允许您即时处理外部服务客户端( 如 EntNatsServiceClient 从 @edifice.io/edifice-ent-client使用NATS连接进行服务间通话.
  • 提供 EntNatsServiceClient 请求/答复.

如何运作:

  • NATS客户端由核心模块初始化并注入.
  • 可以注射吗 EntNatsServiceClient 呼叫外部服务.
  • 您可以使用抽象用户类(由 CLI 生成) 来处理即将到来的事件和请求 .

何时何地:

  • NATS系统在应用程序启动时自动初始化 CoreModule。 。 。 .
  • 不需要手动配置;所有依赖都由核心模块接通.

配置 :

  • NATS连接参数使用环境变量设定:
    NATS_URL=nats://localhost:4222
    NATS_USER=natsuser
    NATS_PASSWORD=natspass
    NATS_DEBUG=false
    
  • 您可以调整这些值以适应您的部署要求 .

调用外部服务:

此示例显示如何使用 EntNatsServiceClient。 。 。 .
包裹 @edifice.io/edifice-ent-client 从 内核 通过CLI.
它是外部依赖,使用由核心模块提供的NATS连接.

import { Injectable } from '@nestjs/common';
import { EntNatsServiceClient } from '@edifice.io/edifice-ent-client';

@Injectable()
export class CommunicationService {
  constructor(private readonly entServiceClient: EntNatsServiceClient) {}

  async addLinkBetweenGroups(
    sourceGroupId: string,
    targetGroupId: string,
  ): Promise<boolean> {
    const request = { startGroupId: sourceGroupId, endGroupId: targetGroupId };
    const response = await this.entServiceClient.addLinkBetweenGroups(request);
    return response.created ?? false;
  }
}

处理酒吧/分公司和服务请求:

这个例子说明了如何使用NestJS的装饰和由CLI产生的抽象类来订阅事件或响应服务请求.

import {
  EventPattern,
  MessagePattern,
  Payload,
  Ctx,
  NatsContext,
} from '@nestjs/microservices';

// These abstract subscriber classes are generated by the CLI.
// You should extend them to implement your own event/message handling logic.

// Example: Subscribe to events
export abstract class BrokerSubscriber {
  @EventPattern('directory.groups.deleted')
  onGroupsDeleted(
    @Payload() data: GroupsDeletedDTO,
    @Ctx() context: NatsContext,
  ) {
    this.handleGroupsDeletedEvent(data, context.getSubject());
  }
  abstract handleGroupsDeletedEvent(
    data: GroupsDeletedDTO,
    subject: string,
  ): void;
}

// Example: Respond to service requests
export abstract class AudienceSubscriber {
  @MessagePattern('audience.check.right.communities.*')
  onCheckResourceAccess(
    @Payload() request: CheckResourceAccessRequestDTO,
    @Ctx() ctx: NatsContext,
  ): Promise<CheckResourceAccessResponseDTO> {
    return this.handleCheckAnnouncementAccess(request, ctx.getSubject());
  }
  abstract handleCheckAnnouncementAccess(
    request: CheckResourceAccessRequestDTO,
    subject: string,
  ): Promise<CheckResourceAccessResponseDTO>;
}

// Example: Concrete implementation
@Controller()
export class MyBrokerSubscriber extends BrokerSubscriber {
  handleGroupsDeletedEvent(data: GroupsDeletedDTO, subject: string): void {
    // Your custom logic here
    console.log(
      `Groups deleted: ${JSON.stringify(data)} from subject: ${subject}`,
    );
  }
}

@Controller()
export class MyAudienceSubscriber extends AudienceSubscriber {
  async handleCheckAnnouncementAccess(
    request: CheckResourceAccessRequestDTO,
    subject: string,
  ): Promise<CheckResourceAccessResponseDTO> {
    // Your custom logic here
    return { accessGranted: true };
  }
}

说明:

  • 您不需要手动配置 NATS; 已准备在导入时使用 CoreModule。 。 。 .
  • 使用 EntNatsServiceClient 用于外部服务呼叫, 以及用于 pub/sub 和 请求/响应模式的抽象用户类.
  • CLI 可以生成抽象用户类来帮助您执行事件和信件处理器.

许可( 授权守护和装饰)

这个 PermissionModule 在导入时自动包含 CoreModule 在您的申请.
它为基于工作流程和管理员的授权提供装饰和守卫,为您的端点提供精细的准入控制.

特征 :

  • @RequirePermission('PERMISSION_NAME'):根据用户工作流程权限限制对端点的访问. 强制装饰.
  • @RequireAdmc(): 限制超级管理员访问端点(ADMC).
  • @Public():标记端点为公用(不需要认证).
  • @BasicAuth(): 为终点添加基本授权方法. 授权用户和密码设置在配置中.

如何运作:

  • 装饰者在您的控制器和端点上设置元数据 .
  • 守护者读取此元数据并检查用户的会话和权限.
  • 权限在AppRegistry服务启动时自动注册.

何时何地:

  • 许可系统在应用程序启动时自动初始化 CoreModule。 。 。 .
  • 不需要手动配置;所有依赖都由核心模块接通.

配置 :

  • 用户权限和角色在会话对象中提供(entSession) (中文(简体) ).
  • 工作流程权限在您的商业逻辑中定义,并通过装饰者注册.

示例

import { Controller, Get, Post } from '@nestjs/common';
import {
  RequirePermission,
  RequireAdmc,
  Public,
  CoreModule,
} from '@edifice.io/edifice-nestjs-core';

@Module({
  imports: [CoreModule], // PermissionModule is included automatically
})
export class AppModule {}

@Controller('resources')
export class ResourceController {
  @Get()
  @RequirePermission('COMMUNITY_ACCESS')
  async findAll() {
    // Only users with COMMUNITY_ACCESS permission can access this endpoint
  }

  @Post('/admin')
  @RequireAdmc() // Only super administrators can access this endpoint
  async adminTask() {
    // Admin logic here
  }

  @Get('public-info')
  @Public()
  async publicInfo() {
    // This endpoint is accessible without authentication
  }
}

说明:
您不需要手动配置权限守护符; 当您导入时, 它们已准备好使用 CoreModule。 。 。 .
所有权限自动注册并强制执行您的端点 .

会话( 用户会话管理)

这个 SessionModule 在导入时自动包含 CoreModule 在您的申请.
它为您 Edifice 后端管理用户会话提供中间软件、装饰和帮助.

特征 :

  • 用于验证每个请求并附加用户会话的中端软件 .
  • 会话装饰器( E)@Session())直接将会话注入控制器方法.
  • 展出关于原始快速化请求对象的会话信息( E)request.raw.entSession) (中文(简体) ).
  • 通过NATS与ENT服务相融合,用于会话验证和刷新.

如何运作:

  • 会话中间软件运行在每一个API请求上,通过ENT服务验证会话,并附在请求上.
  • 您可以使用任意一个 @Session() 装饰或直接取自请求对象.

何时何地:

  • 会话系统在应用程序启动时自动初始化 CoreModule。 。 。 .
  • 不需要手动配置;所有依赖都由核心模块接通.

配置 :

  • 会话验证使用由核心模块提供的NATS连接.

示例

import { Controller, Get, Req } from '@nestjs/common';
import { CoreModule, Session } from '@edifice.io/edifice-nestjs-core';
import { FastifyRequest } from 'fastify';
import { ENTUserSession } from '@edifice.io/edifice-ent-client';

@Module({
  imports: [CoreModule], // SessionModule is included automatically
})
export class AppModule {}

@Controller('profile')
export class ProfileController {
  @Get()
  async getProfile(@Session() session: ENTUserSession) {
    // Access session directly via decorator
    return { userId: session.userId, name: session.displayName };
  }

  @Get('raw')
  async getProfileRaw(@Req() request: FastifyRequest) {
    // Access session via Fastify request object
    const session = request.raw.entSession;
    return { userId: session.userId, name: session.displayName };
  }
}

说明:
您不需要手动配置会话管理; 它已经准备好在导入时使用 CoreModule。 。 。 .
会话信息在所有控制器中都有,可以通过装饰器或请求对象访问.

时间表(通知处)

这个 TimelineModule 在导入时自动包含 CoreModule 在您的申请.
它为登记通知模板和通过Edifice时间表系统向用户发送通知提供服务.

特征 :

  • 注册您的应用程序的通知模板 .
  • 向用户发送通知(带有推取,邮件和预览选项).
  • 与ENT客户端和NATS结合交付.
  • 通过I18n服务支持本地化.

如何运作:

  • 这个 TimelineService 由核心模块初始化并注入.
  • 您可以在启动时或需要时注册通知模板.
  • 您可以通过调用服务方法向用户发送通知.

何时何地:

  • 程序启动时自动初始化时间段系统 CoreModule。 。 。 .
  • 不需要手动配置;所有依赖都由核心模块接通.

配置 :

  • 申请名称( E)APP_NAME)必须使用环境变量设定.
  • 通知模板可以在模块初始化或动态化时注册.

登记通知模板 :

注册通知模板时,您提供 RegisterNotificationRequestDTO 对象.
此对象描述您在 Edifice 时间表系统中的通知将如何出现和行为 .

主要领域 RegisterNotificationRequestDTO数字 :

  • notificationName (字符串):
    通知事件的独特标识符(例如, "MY_EVENT") (中文(简体) ).

  • title (字符串):
    在时间线中向用户显示标题 .

  • body (字符串):
    通知的主要内容或消息(可以包括HTML).

  • appAddress (弦,可选):
    访问与通知相关的应用程序或资源的URL路径.

  • defaultFrequency (单位:千美元)IMMEDIATE | DAILY | WEEKLY | NEVER,可选:
    通知的默认发送频率 .

  • restriction (单位:千美元)NONE | INTERNAL | EXTERNAL | HIDDEN,可选:
    对能见度的限制级别(如只限内部用户).

  • pushNotif (对象,可选):
    按下通知选项, 如移动/网络推的标题和正文 .

  • preview (对象,可选):
    通知的预览配置 .

  • params (对象,可选):
    动态内容或链接的自定义参数.

示例

const template: RegisterNotificationRequestDTO = {
  notificationName: 'MY_EVENT',
  title: 'My Event',
  body: '<b>A new event occurred!</b>',
  appAddress: '/events/123',
  defaultFrequency: 'IMMEDIATE',
  restriction: 'NONE',
  pushNotif: {
    title: 'Event!',
    body: 'You have a new event.',
  },
  preview: {
    imageUrl: '/assets/event.png',
    description: 'Preview of the event notification',
  },
  params: {
    resourceId: '123',
    customParam: 'value',
  },
};
import { Injectable, OnModuleInit } from '@nestjs/common';
import { TimelineService } from '@edifice.io/edifice-nestjs-core';
import { RegisterNotificationRequestDTO } from '@edifice.io/edifice-ent-client';

@Injectable()
export class MyNotificationService implements OnModuleInit {
  constructor(private readonly timelineService: TimelineService) {}

  async onModuleInit() {
    const templates: RegisterNotificationRequestDTO[] = [
      {
        notificationName: 'MY_EVENT',
        title: 'My Event',
        body: 'A new event occurred!',
        // ...other template fields
      },
    ];
    await this.timelineService.registerNotifications(templates);
  }
}

发送通知:

import { TimelineService } from '@edifice.io/edifice-nestjs-core';
import {
  SessionDto,
  SendNotificationRequestDTO,
} from '@edifice.io/edifice-ent-client';

@Injectable()
export class MyService {
  constructor(private readonly timelineService: TimelineService) {}

  async sendNotification(session: SessionDto) {
    const notification: SendNotificationRequestDTO = {
      notificationName: 'MY_EVENT',
      recipientIds: ['userId1', 'userId2'],
      resourceUri: '/resource/123',
      params: { customParam: 'value' },
      pushNotif: {
        title: 'Event!',
        body: 'You have a new event.',
      },
    };

    await this.timelineService.sendNotification(session, notification);
  }
}

说明:

  • 您不需要手动配置时间段系统; 它在导入时可以使用 CoreModule。 。 。 .
  • 通知使用I18n服务本地化,并通过NATS和ENT客户端发送.

Swagger( OpenAPI 文档)

导入时自动启用 Swagger 模块 CoreModule 在应用程序中(除非您通过环境变量禁用).
它为您的 API 提供了交互式 OpenAPI 文档, 可用于 /openapi。 。 。 .

特征 :

  • 从控制器和 DTO 自动生成 OpenAPI 文档.
  • 服务 Swagger UI 在 /openapi 默认.
  • 通过环境变量支持自定义标题,描述,版本和服务器URL.

如何运作:

  • 在应用程序启动时, Swagger 配置并自动启动, 如果 ENABLE_SWAGGER=true (默认).
  • 配置从环境变量读取,并通过 ConfigService。 。 。 .

配置 : 设置以下环境变量来自定义 Swagger :

ENABLE_SWAGGER=true
SWAGGER_SERVER_URL=https://api.example.com
SWAGGER_TITLE=My Edifice API
SWAGGER_DESCRIPTION=API documentation for my Edifice backend
VERSION=1.0.0

说明:
您不需要手动配置 Swagger; 已准备好在导入时使用 CoreModule。 。 。 .
访问您的 API 文档 /openapi。 。 。 .

公用事业

  • 诱饵: 应用程序拖曳工具
  • 实体命名: 数据库实体命名公约
  • 静态资产: 为公用事业服务的静态文件

使用量

基本设置

import { Module } from '@nestjs/common';
import { CoreModule } from '@edifice.io/edifice-nestjs-core';

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

CLI 工具

这个软件包提供了几个CLI工具来帮助您实现常见后端任务的自动化.
安装时每个工具都可以作为二进制 @edifice.io/edifice-nestjs-core。 。 。 .

  • 建筑-遗传-实体: 从数据库中生成 MikroORM 实体
  • 建筑-遗传-元数据: 生成应用程序元数据文件
  • 建筑- k6- 同步- dto: 为 K6 测试同步 DTO
  • 生成- swagger- pdf: 从您的 NestJS API Swagger 文档中生成 PDF

生成实体

目的:
从您的 PostgreSQL 数据库中生成 MikroORM 实体文件 .

用法 :

pnpm edifice-generate-entities --schema <schema-name> [options]

参数 :

  • --schema (需要):用于实体生成的数据库计划名称.
  • --path: 生成实体的目标目录(默认: ./src/entities) (中文(简体) ).
  • --temp-dir: 初始生成的临时目录(默认值 : ./src/temp/entities) (中文(简体) ).
  • --mapping-config: 实体模块映射文件的路径( 默认 : ./src/config/entity-mapping.config.json) (中文(简体) ).
  • --keep-temp: 生成后保留临时目录( E)true 或者说 false,默认值 : false) (中文(简体) ).

实例:

pnpm edifice-generate-entities --schema community
pnpm edifice-generate-entities --schema community --temp-dir ./src/temp --path ./src/entities
pnpm edifice-generate-entities --schema community --mapping-config ./src/config/entity-mapping.config.json
pnpm edifice-generate-entities --schema community --keep-temp true

生成元数据

目的:
生成包含构建日期、 git 承诺散列和分支名称的构建元数据文件 .

用法 :

pnpm edifice-generate-metadata <target-file-path>

参数 :

  • <target-file-path> (需要):将写入元数据的文件路径.

示例

pnpm edifice-generate-metadata ./dist/metadata.txt

同步 K6 DTO

目的:
将DTO TypeScript定义同步到K6相容类型,用于API测试.

用法 :

pnpm edifice-k6-sync-dto

参数 :
此脚本对 DTO 和输出路径使用配置常数.
如果支持的话, 您可以调整脚本中的路径或通过环境变量 .

示例

pnpm edifice-k6-sync-dto

细节 :

  • 解析来自 client/rest/src/dtos。 。 。 .
  • 生成 K6 兼容类型 types/generated。 。 。 .
  • 不包括命名的文件 index.ts 默认.

生成- swagger- pdf

目的:
从您的 NestJS 服务器所曝光的 Swagger (OpenAPI) 文档中生成一个 PDF .

用法 :

npx generate-swagger-pdf --host <host> --port <port>

选项 :

  • --host, (中文(简体) ), -h: Swagger 服务器主机( 默认 : 127.0.0.1(中文(简体) )
  • --port, (中文(简体) ), -p: Swagger 服务器端口(默认值 : 3002(中文(简体) )

PDF 将在 documentation/api-docs.pdf 您的工程文件夹 .

示例

npx generate-swagger-pdf --host 127.0.0.1 --port 4000

这个软件包提供了几个CLI工具来帮助您实现常见后端任务的自动化.
安装时每个工具都可以作为二进制 @edifice.io/edifice-nestjs-core。 。 。 .

  • 建筑-遗传-实体: 从数据库中生成 MikroORM 实体
  • 建筑-遗传-元数据: 生成应用程序元数据文件
  • 建筑- k6- 同步- dto: 为 K6 测试同步 DTO
  • 生成- swagger- pdf: 从您的 NestJS API Swagger 文档中生成 PDF

说明:
所有CLI工具安装后都可以使用.
你可以和他们一起运行 pnpm 或者说 npx 从您的项目根.

QQ 配置

核心模块使用 NestJS ConfigModule 用于配置。 您可以通过环境变量或配置文件提供配置.

环境变量

  • DATABASE_URL: PostgreSQL 连接字符串
  • NATS_URL: NATS 服务器 URL
  • LOG_LEVEL: 日志级别(调试、信息、警告、错误)
  • NODE_ENV环境(发展、生产)

发展

# Install dependencies
pnpm install

# Build
pnpm build

# Format code
pnpm format

# Lint code
pnpm lint

问题

报告问题 GitHub 问题。 。 。 .

版本与发布记录

@edifice.io/edifice-nestjs-core 共发布 117 个版本,首次发布于 2025/12/01;过去 12 个月发布了 117 个版本。

版本发布日期距今
1.0.7latest2026/11/14今天
1.0.6-develop.202611100922012026/11/103 天前
1.0.6-develop.202611092053462026/11/104 天前
1.0.6-develop.202611091648292026/11/104 天前
1.0.6-develop.202611091608322026/11/104 天前
1.0.6-develop.202611052251022026/11/068 天前

其他发布通道:feat-PEDAGO-3968 → 1.0.0-develop-pedago.20260429142813,feat-basic-auth-guard → 1.0.0-develop-pedago.20260430125558,chore-upgrade-orm-dependency → 1.0.0-develop-pedago.20260505114249,fix-PEDAGO-3997 → 1.0.0-develop-pedago.20260512111340,feat-PEDAGO-3959-storage-module → 1.0.3-develop-pedago.20260520165333,feat-PEDAGO-4289 → 1.0.5-develop-pedago.20260903132341。

关于 @edifice.io/edifice-nestjs-core 的常见问题

@edifice.io/edifice-nestjs-core 是什么?

Edifice应用软件的核心NestJS模块和公用事业

如何安装 @edifice.io/edifice-nestjs-core?

在项目目录运行 npm install @edifice.io/edifice-nestjs-core,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:rxjs(7.8.2)、fastify(5.6.0)、@nestjs/core(11.0.20)、@nestjs/common(11.0.20)、@nestjs/config(4.0.0)、@mikro-orm/core(6.6.10)、@nestjs/swagger(11.2.0)、@nestjs/terminus(11.0.0)、reflect-metadata(0.2.0)、@mikro-orm/nestjs(6.1.1)、@mikro-orm/postgresql(6.6.10)、@nestjs/microservices(11.0.20)、@nestjs/platform-fastify(11.0.20)、@edifice.io/edifice-ent-client(6.16.11)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。它还提供命令行工具 edifice-k6-sync-dto、edifice-update-version、edifice-generate-entities、edifice-generate-metadata、edifice-update-rn-version、edifice-generate-rest-client、edifice-generate-swagger-pdf,可以用 npx edifice-k6-sync-dto 直接运行。

@edifice.io/edifice-nestjs-core 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@edifice.io/edifice-nestjs-core 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

@edifice.io/edifice-nestjs-core 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=20。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@edifice.io/edifice-nestjs-core 可以商用吗?

@edifice.io/edifice-nestjs-core 使用 AGPL-3.0 许可。最严格的 Copyleft:除分发外,通过网络向用户提供基于它的服务也需要开源对应源码。闭源 SaaS 使用前务必评估。以上为概括,不构成法律意见,请以许可原文为准。

@edifice.io/edifice-nestjs-core 的下载量有多少?

根据 npm 官方下载统计,@edifice.io/edifice-nestjs-core 在 2026/10/13 – 2026/11/11 这 30 天内被下载 3,097 次,日均约 103 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@edifice.io/edifice-nestjs-core 还在维护吗?

最新版本 1.0.7 发布于 2026/11/14(今天);至今共发布 117 个版本,其中过去 12 个月发布了 117 个;首次发布于 2025/12/01。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。