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

yh2wf1be  于 2023-06-24  发布在  TypeScript
关注(0)|答案(4)|浏览(212)

我知道如何从命令行运行脚本,使用npmnpx ts-node [script.ts],正如所述here
我的问题是不同的,现在我可以运行脚本,我可以使用项目中模块内部的服务吗?假设我有这样的结构,它通常在项目内部被其他模块调用:
foo/foo.module.ts

  1. import { HttpModule, Module } from '@nestjs/common';
  2. @Module({
  3. providers: [FooService],
  4. imports: [HttpModule],
  5. exports: [FooService]
  6. })
  7. export class FooModule { }

foo/foo.service.ts

  1. import { HttpService, Injectable } from '@nestjs/common';
  2. @Injectable()
  3. export class FooService {
  4. constructor(
  5. private readonly httpService: HttpService,
  6. ) {}
  7. bar() {
  8. console.log('do stuff');
  9. }
  10. }

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

xtupzzrd

xtupzzrd1#

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

  1. import { Module } from '@nestjs/common';
  2. import { UsersModule } from './users/users.module';
  3. @Module({
  4. imports: [
  5. UsersModule,
  6. ],
  7. })
  8. export class ApplicationModule {}

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

  1. import { Module } from '@nestjs/common';
  2. @Module({
  3. providers: [UsersService],
  4. exports: [UsersService],
  5. })
  6. export class UsersModule {}

并且您希望创建一个命令,以直接从命令行创建一个新用户。
您可以创建一个名为console.ts的文件,并将以下内容放入:

  1. import { NestFactory } from '@nestjs/core';
  2. import { ApplicationModule } from './application.module';
  3. import { UsersService } from './users/users.service';
  4. async function bootstrap() {
  5. const application = await NestFactory.createApplicationContext(
  6. ApplicationModule,
  7. );
  8. const command = process.argv[2];
  9. switch (command) {
  10. case 'create-administrator-user':
  11. const usersService = application.get(UsersService);
  12. await usersService.create({
  13. username: 'administrator',
  14. password: 'password',
  15. });
  16. break;
  17. default:
  18. console.log('Command not found');
  19. process.exit(1);
  20. }
  21. await application.close();
  22. process.exit(0);
  23. }
  24. bootstrap();

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

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

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

  1. // Using Yarn
  2. yarn execute create-administrator-user
  3. // Using NPM
  4. npm run execute create-administrator-user
展开查看全部
ercv8c1e

ercv8c1e2#

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

waxmsbnn

waxmsbnn3#

通常,要使用服务,您需要示例化服务类。Nest通常是NestFactory.create的一部分。你可以做的事情是这样的:

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

现在,您所需要的就是编译这些文件,并像在服务器上一样使用node运行它们。

qacovj5a

qacovj5a4#

要解决相对路径问题,请将此添加到ts-config中

  1. {
  2. "ts-node": {
  3. // Do not forget to `npm i -D tsconfig-paths`
  4. "require": ["tsconfig-paths/register"]
  5. }
  6. }

来源:https://typestrong.org/ts-node/docs/paths/

相关问题