0

我想用户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$ 

但是,当我 deleteprogram.parse(process.argv)时,一切正常,它可以将新User实例返回给我。

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

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

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

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

4

2 回答 2

0

在 Node.js 中,process.argv一个数组,其中包含启动 Node.js 进程时传递的命令行参数。因此,program.parse(process.argv)解析参数的命令行选项,这是绕过您的inquierer.js提示。你可以把它排除在外。

于 2020-05-22T20:56:09.700 回答
0

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

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

.action(() => {
   // code goes here
});
于 2020-12-26T00:18:25.043 回答