我有一个 Express.js 应用程序,正在迁移到 Nest.js,一些应用程序模块正在使用 Nest.js,有些则没有。
假设我有一个 OrderModule,它是一个 Nest.js 模块,并且它的提供程序中有一个 OrderService,我想在不是 NestJS 模块的产品模块中使用 OrderService。 是否可以在不将产品模块转换为 NestJS 模块的情况下获取 OrderService 的实例?
从应用程序外部访问 Nest DI 容器的唯一方法是导出由
app
创建的 NestFactory.create()
实例,然后调用 app.get(OrderService)
检索服务。
与上述答案之一相同,但带有代码。我自己测试了一下,确实有效
// nextjs/src/action.ts
"use server";
import { NestFactory } from "@nestjs/core";
import { AppModule } from "@api/app.module";
import { AppService } from "@api/app.service";
export async function getHelloAction() {
const app = await NestFactory.create(AppModule);
const appService = app.get(AppService);
const result = appService.getHello();
await app.close();
return result;
}
// nestjs/src/app.service.ts
import { Injectable, Logger } from '@nestjs/common';
@Injectable()
export class AppService {
constructor(private readonly logger: Logger) {}
getHello(): string {
const message = 'Hello World!';
this.logger.log(message);
return message;
}
}
// nestjs/src/app.module.ts
import { Module, Logger } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService, Logger],
})
export class AppModule {}
这只是包含'apn'模块的示例(不是nestjs原生的)
import { Injectable } from '@nestjs/common';
import { UserGateway } from '../../users/gateways/user.gateway';
@Injectable()
export class NotificationsGateway {
private user: UserGateway;
private appleapn = require('apn');
...