我想用commander.js
和inquirer.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)
时,一切正常,它可以向我返回新的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.argv
是一个数组,其中包含启动 Node.js 进程时传递的命令行参数。因此,program.parse(process.argv)
解析参数的命令行选项,这会绕过inquierer.js
提示符。你可以把它排除在外。
program.parse(process.argv)
在设置程序后调用。它采用命令行参数(process.argv
(并使用您声明的程序解析它们,显示错误或调用动作处理程序等。
根据您的示例代码,一个问题是操作处理程序采用函数参数。
.action(() => {
// code goes here
});