`program.parse(process.argv)` 在 commander.js 中做什么?

what does `program.parse(process.argv)` do in commander.js?

我想让用户 commander.jsinquirer.js 提出问题并收集答案以创建 User 实例:

// index.js
const mongoose = require('mongoose');
const User = require('./model/user')
const {addUser,listAllUsers,findUserByEmail,updateUser,deleteUser} = require('./model_methods/user_methods')
const { program } = require('commander');
var inquirer = require('inquirer');

// connect to DB
const db = mongoose.connect('mongodb://localhost:27017/myImportantDates', {
    useNewUrlParser: true, 
    useUnifiedTopology: true, 
});

const questions = [
    {
      type: 'input',
      name: 'email',
      message: 'user email'
    },
    {
      type: 'input',
      name: 'name',
      message: 'user name'
    },
    {
      type: 'input',
      name: 'password',
      message: 'user password'
    },
  ];



program
   .version('0.0.1')
   .description('The important dates app');

program
   .command('add')
   .alias('a')
   .description('Add a user')
   .action(
       inquirer
         .prompt(questions)
         .then( answers => {
            addUser(answers)
          })
          .catch(err =>{
            console.log(error) 
          })
   )
program.parse(process.argv);

当我 运行 它与 node index.js add 时,问题数组问一个问题并退出:

@DESKTOP-5920U38:/mnt/c/Users/myApp$ node index.js add
? user email 
@DESKTOP-5920U38:/mnt/c/Users/myApp$ 

然而,当我删除 program.parse(process.argv) 时,一切正常,它可以 return 我新的 User 实例。

我查看文件:https://github.com/tj/commander.js/ 仍然不知道发生了什么。有人知道更多吗??

我刚才发现,如果我在 program 实例的第一个设置中像这样把 program.parse(process.argv) 放在开头:

program
   .version('0.0.1')
   .description('The important dates app')
   .parse(process.argv);

它也有效。但我仍然不知道为什么顺序很重要。

在Node.js中,process.argvan array containing the command line arguments passed when the Node.js process was launched。因此,program.parse(process.argv) 解析参数的命令行选项,这绕过了您的 inquierer.js 提示。你可以忽略它。

program.parse(process.argv) 在设置程序后调用。它接受命令行参数 (process.argv) 并使用您声明的程序解析它们,显示错误或调用操作处理程序等。

根据您的示例代码,问题是操作处理程序采用函数参数。例如

.action(() => {
   // code goes here
});