使用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
相关产品推荐
相关产品推荐

