在NestJS中使用yargs报错:yargs_1.default.options is not a function
解决yargs在NestJS中出现TypeError: yargs_1.default.options is not a function的问题
问题场景
在NestJS应用中尝试用yargs获取命令行参数,cli.ts代码如下:
import yargs from 'yargs'; const argv = yargs .options('awsRegion', { description: 'AWS Region (e.g. us-east-1, us-west-1)', alias: 'aws-region', type: 'string', default: 'aws-east-1', }) .options('avbLeaderId', { description: 'leader id to be used for leader election', alias: 'avb-leader-id', type: 'string', default: 'avb-leader-id', }) .parseSync(); export default argv;
在DbService构造函数中调用参数:
export class DbService { private client: DynamoDB; constructor() { this.client = new DynamoDB({ region: argv.awsRegion, }); } }
执行npm run start:dev --aws-region=us-west-1时抛出错误:
.options('awsRegion', { ^ TypeError: yargs_1.default.options is not a function
解决方案
1. 修正yargs导入与初始化方式
yargs v16+版本的ES模块导入需要显式传入命令行参数数组,结合hideBin处理掉node和脚本路径参数,修改cli.ts:
import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; // 修正默认区域为正确的us-east-1 const argv = yargs(hideBin(process.argv)) .options('awsRegion', { description: 'AWS Region (e.g. us-east-1, us-west-1)', alias: 'aws-region', type: 'string', default: 'us-east-1', }) .options('avbLeaderId', { description: 'leader id to be used for leader election', alias: 'avb-leader-id', type: 'string', default: 'avb-leader-id', }) .parseSync(); export default argv;
2. 修正命令行参数传递方式
NestJS的npm run start:dev命令需要把自定义参数放在--之后,正确命令为:
npm run start:dev -- --aws-region=us-west-1
--会告诉npm将后续参数传递给实际执行的NestJS脚本。
3. 可选:添加类型提示(增强TS支持)
定义参数接口来获得类型校验:
interface CliArgs { awsRegion: string; avbLeaderId: string; } const argv = yargs(hideBin(process.argv)) // 保持原有配置 .parseSync() as CliArgs;
原因说明
- 新版yargs不再直接导出可链式调用的默认实例,必须传入命令行参数数组后才能调用
options等方法,之前的写法导致获取的yargs对象无options方法,触发类型错误。 - 原代码中默认AWS区域
aws-east-1是错误的,修正为us-east-1避免后续DynamoDB连接失败。
内容的提问来源于stack exchange,提问作者Ashutosh Pandey
相关产品推荐
相关产品推荐

