You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用nest-commander构建Seeder时执行命令报未知命令错误求助

使用nest-commander构建Seeder时unknown command my-exec错误排查

问题场景

  • 已创建src/commands/seed.command.ts定义命令:
    import { Command, CommandRunner } from 'nest-commander';
    
    @Command({
      name: 'my-exec',
      arguments: '<task>',
      options: { isDefault: true },
    })
    export class BasicCommand extends CommandRunner {
      async run(inputs: string[], options: Record<string, any>): Promise<void> {
        console.log('here will be my seeder');
      }
    }
    
  • main.ts中调用CommandFactory.run(AppModule, ['warn', 'error']),同时启动了HTTP服务
  • app.module.ts的providers已添加BasicCommand
  • 执行crun my-exec时,报错unknown command my-exec

排查与解决步骤

1. 修正命令执行方式

crun并非nest-commander默认的命令入口,需调整执行逻辑:

  • 在package.json中添加命令脚本:
    "scripts": {
      "command": "nest-commander run"
    }
    
  • 执行命令时使用:npm run command my-exec <task>(<task>为命令定义的必填参数)

2. 分离HTTP服务与命令行模式

CommandFactory.run会直接处理命令参数并退出进程,与HTTP服务启动逻辑冲突,需区分执行模式:
修改main.ts:

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Logger } from '@nestjs/common';
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger';
import { CommandFactory } from 'nest-commander';

const port = process.env.PORT || 3000;

async function bootstrap() {
  // 检测是否有命令行参数,优先执行命令
  const hasCommandArgs = process.argv.length > 2 && !process.argv.includes('--port');
  if (hasCommandArgs) {
    await CommandFactory.run(AppModule, ['warn', 'error']);
  } else {
    const app = await NestFactory.create(AppModule);
    app.enableCors();
    const options = new DocumentBuilder()
      .addBearerAuth()
      .setTitle('CHS')
      .setDescription('CHS API')
      .setVersion('1.0')
      .build();
    const document = SwaggerModule.createDocument(app, options);
    SwaggerModule.setup('api', app, document);
    await app.listen(port);
    Logger.log(`CHS is running on port: ${port} `, 'Bootstrap');
  }
}
bootstrap();

也可以拆分两个入口文件:一个用于启动HTTP服务,一个专门处理命令。

3. 确保命令类正确注册

如果命令属于独立模块,需创建CommandsModule并导入到AppModule:

// src/commands/commands.module.ts
import { Module } from '@nestjs/common';
import { BasicCommand } from './seed.command';

@Module({
  providers: [BasicCommand],
  exports: [BasicCommand],
})
export class CommandsModule {}

在AppModule中导入CommandsModule,确保命令能被nest-commander扫描到。

4. 提供必填命令参数

命令定义了<task>必填参数,执行时必须传入,例如:

npm run command my-exec init-seed

内容的提问来源于stack exchange,提问作者Boychik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 06:41:27