如何从NPM脚本获取对象参数(NodeJS + TypeScript)
问题:NPM脚本传递对象时解析出多余逗号,无法正常使用
我想通过NPM脚本传递一个对象,示例脚本如下:
"update-user-roles": "ts-node user-roles.ts {PAID_USER: true, VIP: true}"
函数能获取到对象,但会自动添加多余逗号,导致无法正确更新用户。请问怎么原样接收这个对象?
我的代码:
async function updateUserRoles(roles: any) { const userID = await getAuth().then((res) => res.uid); updateUser({ userID: userID, fields: { roles: { roles }, } }) console.log(`User roles successfully added: ${roles}`) } const rolesString = JSON.stringify(process.argv.slice(2)) updateUserRoles(JSON.parse(rolesString))
得到的日志:
User roles successfully added: {PAID_USER:,true,,VIP:,true}
解决方法
问题根源
命令行会把空格作为参数分隔符,你写的{PAID_USER: true, VIP: true}会被拆成{PAID_USER:、true,、VIP:、true}四个独立的命令行参数。你用JSON.stringify(process.argv.slice(2))把这些参数拼成数组再转字符串,解析后自然会出现多余逗号的混乱结构。
具体方案
方案1:给对象参数加引号,让命令行识别为单个字符串
修改NPM脚本,把对象用引号包裹(注意和外层JSON的引号区分,需要转义):
"update-user-roles": "ts-node user-roles.ts '{\"PAID_USER\": true, \"VIP\": true}'"
然后代码里直接取第一个参数,不用处理数组:
const rolesString = process.argv[2]; updateUserRoles(JSON.parse(rolesString));
注意:Windows系统下引号转义规则不同,可能需要改成:
"update-user-roles": "ts-node user-roles.ts \"{\\\"PAID_USER\\\": true, \\\"VIP\\\": true}\""
方案2:用环境变量传递对象
把对象放到环境变量里,避开命令行参数的解析问题:
修改NPM脚本:
"update-user-roles": "ROLES='{\"PAID_USER\": true, \"VIP\": true}' ts-node user-roles.ts"
代码里读取环境变量:
const rolesString = process.env.ROLES; if (!rolesString) { throw new Error("请传入roles参数"); } updateUserRoles(JSON.parse(rolesString));
方案3:拆分参数,代码里组装对象
如果不想处理引号转义,可以把键值对分开传递,代码里再组装成对象:
修改NPM脚本:
"update-user-roles": "ts-node user-roles.ts PAID_USER=true VIP=true"
代码里处理参数:
const roles = process.argv.slice(2).reduce((acc, item) => { const [key, value] = item.split('='); // 处理布尔值的转换 acc[key] = value === 'true' ? true : value === 'false' ? false : value; return acc; }, {} as Record<string, any>); updateUserRoles(roles);
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

