Recipes

读取-求值-打印循环 (REPL)

了解如何使用 NestJS REPL 功能来检查依赖图并直接从终端调用提供者和控制器的方法。

读取-求值-打印循环 (REPL)

REPL 是一个简单的交互式环境,它接受单个用户输入,执行它们,并将结果返回给用户。 REPL 功能让您可以检查依赖图并直接从终端调用提供者(和控制器)的方法。

使用方法

要在 REPL 模式下运行您的 NestJS 应用程序,请创建一个新的 repl.ts 文件(与现有的 main.ts 文件并列)并在其中添加以下代码:

@@filename(repl)
import { repl } from '@nestjs/core';
import { AppModule } from './src/app.module';

async function bootstrap() {
  await repl(AppModule);
}
bootstrap();
@@switch
import { repl } from '@nestjs/core';
import { AppModule } from './src/app.module';

async function bootstrap() {
  await repl(AppModule);
}
bootstrap();

现在在您的终端中,使用以下命令启动 REPL:

$ npm run start -- --entryFile repl

info 提示 repl 返回一个 Node.js REPL 服务器 对象。

一旦启动并运行,您应该在控制台中看到以下消息:

LOG [NestFactory] Starting Nest application...
LOG [InstanceLoader] AppModule dependencies initialized
LOG REPL initialized

现在您可以开始与依赖图进行交互。例如,您可以检索一个 AppService(我们在这里使用启动项目作为示例)并调用 getHello() 方法:

> get(AppService).getHello()
'Hello World!'

您可以在终端中执行任何 JavaScript 代码,例如,将 AppController 的实例分配给局部变量,并使用 await 调用异步方法:

> appController = get(AppController)
AppController { appService: AppService {} }
> await appController.getHello()
'Hello World!'

要显示给定提供者或控制器上所有可用的公共方法,请使用 methods() 函数,如下所示:

> methods(AppController)

Methods:
 ◻ getHello

要将所有注册的模块与其控制器和提供者一起打印为列表,请使用 debug()

> debug()

AppModule:
 - controllers:
  ◻ AppController
 - providers:
  ◻ AppService

快速演示:

您可以在下面的部分中找到有关现有预定义原生方法的更多信息。

原生函数

内置的 NestJS REPL 带有一些在启动 REPL 时全局可用的原生函数。您可以调用 help() 来列出它们。

如果您不记得函数的签名(即:期望的参数和返回类型),您可以调用 <function_name>.help。 例如:

> $.help
Retrieves an instance of either injectable or controller, otherwise, throws exception.
Interface: $(token: InjectionToken) => any

info 提示 这些函数接口是用 TypeScript 函数类型表达式语法 编写的。

函数描述签名
debug将所有注册的模块与其控制器和提供者一起打印为列表。debug(moduleCls?: ClassRef | string) => void
get$检索可注入或控制器的实例,否则抛出异常。get(token: InjectionToken) => any
methods显示给定提供者或控制器上所有可用的公共方法。methods(token: ClassRef | string) => void
resolve解析可注入或控制器的瞬态或请求作用域实例,否则抛出异常。resolve(token: InjectionToken, contextId: any) => Promise<any>
select允许浏览模块树,例如,从选定的模块中提取特定实例。select(token: DynamicModule | ClassRef) => INestApplicationContext

监视模式

在开发过程中,以监视模式运行 REPL 以自动反映所有代码更改是很有用的:

$ npm run start -- --watch --entryFile repl

这有一个缺陷,REPL 的命令历史记录在每次重新加载后都会被丢弃,这可能很麻烦。 幸运的是,有一个非常简单的解决方案。像这样修改您的 bootstrap 函数:

async function bootstrap() {
  const replServer = await repl(AppModule);
  replServer.setupHistory(".nestjs_repl_history", (err) => {
    if (err) {
      console.error(err);
    }
  });
}

现在历史记录在运行/重新加载之间得到保留。