Использование сервисов внутри скрипта NestJS запускается из командной строки

Я знаю, как запустить скрипт из командной строки, используя npm или npx ts-node [script.ts], как указано здесь.

Мой вопрос в другом: теперь, когда я могу запускать сценарии, могу ли я использовать службы, которые находятся внутри модулей в моем проекте? Допустим, у меня есть такая структура, которую обычно вызывают внутри проекта другие модули:

foo/foo.module.ts

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

@Module({
  providers: [FooService],
  imports: [HttpModule],
  exports: [FooService]
})
export class FooModule { }

foo/foo.service.ts

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

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

    bar() {
        console.info('do stuff');
    }
}

как я могу вызвать bar() внутри файла /src/script.ts, а затем вызвать npx ts-node script.ts, сохранив весь импорт? Спасибо.

вы проверяли этот пакет? командаnesjs

antoineso 11.12.2020 12:47

@antoineso нет, я попробую. Спасибо

Ripper346 11.12.2020 13:09
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
14
2
6 942
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Как правило, для использования службы необходимо создать экземпляр класса службы. Nest обычно делает это как часть NestFactory.create. Что вы можете сделать, это что-то вроде этого:

async function bootstrap() {
  const app = await NestFactory.createApplicationContext(FooModule);
  const service = app.get<FooService>(FooService); // this sets the type of service and gets the instance
  service.bar();
  await app.close();
}

Теперь все, что вам нужно, это скомпилировать файлы и запустить их с помощью node, как обычно на сервере.

Ответ принят как подходящий

Допустим, у вас есть такой модуль приложения:

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

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

И UserService, используемый UsersModule таким образом:

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

@Module({
  providers: [UsersService],
  exports: [UsersService],
})
export class UsersModule {}

И вы хотите создать команду для создания нового пользователя прямо из командной строки.

Вы можете создать файл с именем 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.info('Command not found');
      process.exit(1);
  }

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

bootstrap();

И теперь в вашем package.json вы можете создать следующий скрипт:

"execute": "ts-node ./src/console.ts"

Теперь у вас есть возможность вызывать пользовательскую команду в контексте NestJS, как в следующем примере:

// Using Yarn
yarn execute create-administrator-user

// Using NPM
npm run execute create-administrator-user

Итак, единственное, что я был вынужден преобразовать все импорты моего проекта из src/[...] в относительные пути, потому что он не смог их разрешить. В остальном это работает как шарм. Спасибо

Ripper346 06.01.2021 12:34

Просто мне пришло в голову, что если у меня есть несколько вложенных заданий cron в проекте, и случается так, что в момент запуска сценария он также находится во время задания cron, он выполняется или нет?

Ripper346 06.01.2021 12:45

Чтобы добавить к ответу @Emanuele. Если у вас есть проблема с относительным путем src/[...], то вместо запуска скрипта с ts-node попробуйте запустить его со следующим "узел -r ts-узел/зарегистрировать -r tsconfig-пути/зарегистрировать путь_к_скрипту"

Другие вопросы по теме