Passer au contenu

Read-Eval-Print-Loop (REPL)

REPL est un environnement interactif simple qui prend des entrées utilisateur uniques, les exécute et renvoie le résultat à l’utilisateur. La fonctionnalité REPL vous permet d’inspecter votre graphe de dépendances et d’appeler des méthodes sur vos fournisseurs (et contrôleurs) directement depuis votre terminal.

Utilisation

Pour exécuter votre application NestJS en mode REPL, créez un nouveau fichier repl.ts (à côté du fichier main.ts existant) et ajoutez le code suivant à l’intérieur :

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

Maintenant, dans votre terminal, démarrez le REPL avec la commande suivante :

Fenêtre de terminal
$ npm run start -- --entryFile repl

Une fois en marche, vous devriez voir le message suivant dans votre console :

Fenêtre de terminal
LOG [NestFactory] Démarrage de l'application Nest...
LOG [InstanceLoader] Dépendances de AppModule initialisées
LOG REPL initialisé

Maintenant, vous pouvez commencer à interagir avec votre graphe de dépendances. Par exemple, vous pouvez récupérer un AppService (nous utilisons le projet de démarrage comme exemple ici) et appeler la méthode getHello() :

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

Vous pouvez exécuter n’importe quel code JavaScript depuis votre terminal, par exemple, assigner une instance de AppController à une variable locale, et utiliser await pour appeler une méthode asynchrone :

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

Pour afficher toutes les méthodes publiques disponibles sur un fournisseur ou contrôleur donné, utilisez la fonction methods(), comme suit :

> methods(AppController)
Méthodes:
◻ getHello

Pour imprimer tous les modules enregistrés en tant que liste avec leurs contrôleurs et fournisseurs, utilisez debug().

> debug()
AppModule:
- contrôleurs:
◻ AppController
- fournisseurs:
◻ AppService

Fonctions natives

Le REPL intégré à NestJS est livré avec quelques fonctions natives qui sont disponibles globalement lorsque vous démarrez le REPL. Vous pouvez appeler help() pour les lister.

Si vous ne vous rappelez pas quelle est la signature (c’est-à-dire : les paramètres attendus et un type de retour) d’une fonction, vous pouvez appeler <function_name>.help. Par exemple :

> $.help
Récupère une instance d'injectable ou de contrôleur, sinon, génère une exception.
Interface: $(token: InjectionToken) => any
FonctionDescriptionSignature
debugImprime tous les modules enregistrés en tant que liste avec leurs contrôleurs et fournisseurs.`debug(moduleCls?: ClassRef
get ou $Récupère une instance d’injectable ou de contrôleur, sinon, génère une exception.get(token: InjectionToken) => any
methodsAffiche toutes les méthodes publiques disponibles sur un fournisseur ou contrôleur donné.`methods(token: ClassRef
resolveRésout une instance transitoire ou à portée de demande d’injectable ou de contrôleur, sinon, génère une exception.resolve(token: InjectionToken, contextId: any) => Promise<any>
selectPermet de naviguer dans l’arbre des modules, par exemple, pour extraire une instance spécifique du module sélectionné.`select(token: DynamicModule

Mode surveillance

Lors du développement, il est utile d’exécuter REPL en mode surveillance pour refléter automatiquement tous les changements de code :

Fenêtre de terminal
$ npm run start -- --watch --entryFile repl

Cela a un inconvénient, l’historique des commandes du REPL est perdu après chaque rechargement, ce qui peut être contraignant. Heureusement, il existe une solution très simple. Modifiez votre fonction bootstrap comme suit :

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

Maintenant, l’historique est préservé entre les exécutions/rechargements.