使用从命令行运行的 NestJS 脚本中的服务

Rip*_*346 4 command-line typescript nestjs

我知道如何从命令行运行脚本,使用npmnpx ts-node [script.ts]正如此处所述

我的问题是不同的,现在我可以运行脚本,我可以使用项目中模块内部的服务吗?假设我有这个结构,它通常在项目内部被其他模块调用:

foo/foo.module.ts

import { HttpModule, Module } from '@nestjs/common';

@Module({
  providers: [FooService],
  imports: [HttpModule],
  exports: [FooService]
})
export class FooModule { }
Run Code Online (Sandbox Code Playgroud)

foo/foo.service.ts

import { HttpService, Injectable } from '@nestjs/common';

@Injectable()
export class FooService {
    constructor(
        private readonly httpService: HttpService,
    ) {}

    bar() {
        console.log('do stuff');
    }
}
Run Code Online (Sandbox Code Playgroud)

如何bar()在文件内部调用/src/script.ts然后调用npx ts-node script.ts保留所有导入?谢谢你。

Ema*_*oli 9

假设您有一个这样的应用程序模块:

import { Module } from '@nestjs/common';
import { UsersModule } from './users/users.module';

@Module({
  imports: [
    UsersModule,
  ],
})
export class ApplicationModule {}

Run Code Online (Sandbox Code Playgroud)

以及 UsersModule 以这种方式使用的 UserService:

import { Module } from '@nestjs/common';

@Module({
  providers: [UsersService],
  exports: [UsersService],
})
export class UsersModule {}
Run Code Online (Sandbox Code Playgroud)

并且您想创建一个命令以直接从命令行创建新用户。

您可以创建一个名为的文件console.ts并放置以下内容:

import { NestFactory } from '@nestjs/core';
import { ApplicationModule } from './application.module';
import { UsersService } from './users/users.service';

async function bootstrap() {
  const application = await NestFactory.createApplicationContext(
    ApplicationModule,
  );

  const command = process.argv[2];

  switch (command) {
    case 'create-administrator-user':
      const usersService = application.get(UsersService);
      await usersService.create({
        username: 'administrator',
        password: 'password',
      });
      break;
    default:
      console.log('Command not found');
      process.exit(1);
  }

  await application.close();
  process.exit(0);
}

bootstrap();
Run Code Online (Sandbox Code Playgroud)

现在,您package.json可以创建以下脚本:

"execute": "ts-node ./src/console.ts"
Run Code Online (Sandbox Code Playgroud)

现在您可以在 NestJS 上下文中调用自定义命令,如下例所示:

// Using Yarn
yarn execute create-administrator-user

// Using NPM
npm run execute create-administrator-user
Run Code Online (Sandbox Code Playgroud)


小智 5

添加到@Emanuele 答案。如果您对 src/[...] 相对路径有问题,则不要使用 ts-node 运行脚本,而是尝试使用以下“node -r ts-node/register -r tsconfig-paths/register path_to_script”运行