Я знаю, как запустить скрипт из командной строки, используя 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
, сохранив весь импорт? Спасибо.
@antoineso нет, я попробую. Спасибо
Как правило, для использования службы необходимо создать экземпляр класса службы. 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/[...]
в относительные пути, потому что он не смог их разрешить. В остальном это работает как шарм. Спасибо
Просто мне пришло в голову, что если у меня есть несколько вложенных заданий cron в проекте, и случается так, что в момент запуска сценария он также находится во время задания cron, он выполняется или нет?
Чтобы добавить к ответу @Emanuele. Если у вас есть проблема с относительным путем src/[...], то вместо запуска скрипта с ts-node попробуйте запустить его со следующим "узел -r ts-узел/зарегистрировать -r tsconfig-пути/зарегистрировать путь_к_скрипту"
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, которые помогут другим понять, как это отвечает на заданный вопрос. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
вы проверяли этот пакет? командаnesjs