首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Minimist中的命令验证

Minimist中的命令验证
EN

Stack Overflow用户
提问于 2014-11-20 00:24:46
回答 1查看 831关注 0票数 1

新手到Minimist命令解析器,并面临着一个问题。

用户输入命令:

代码语言:javascript
复制
Project -a   

我必须验证输入的命令是否有正确的选项。

所以我的代码如下:

代码语言:javascript
复制
var commands = ["project", "user"];
var commandEntered = require('minimist')(command.split(' '));  
if(commands.indexOf(commandEntered._) > -1){
    //i.e. Check if user has entered either project or user and then do following
   if(commandEntered._ == "project") {
     var options = ["a", "u", "l"];
        delete commandEntered._;
        var optionsEntered = Object.keys(commandEntered);  
        for(var i=0;i<optionsEntered.length;i++){
           if(options.indexOf(optionsEntered) > -1){
                if(optionsEntered == "a" && commandEntered.a == true)
                {
                    console.log("Option a entered");
                } 
           }
        }
   }
}  
else{
  return "Invalid Command";
}  

我如何验证命令中是否有不需要的选项,或者是否有命令:

代码语言:javascript
复制
 project -a -n <name>  

如何设置规则,告知如果选项为'n‘,则必须提供名称;如果存在选项'a’,则不能包含选项'l‘。我有什么办法可以解决这个问题吗?

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2014-11-21 19:36:31

这可以是简单的检查,也可以是复杂的检查,具体取决于您的需要。

基本检查是否有'a‘命令:

代码语言:javascript
复制
if (commandEntered.a) {
  console.log('we have option a')
} else {
  console.log("we don't have it")
}

检查不需要的选项(例如):

代码语言:javascript
复制
var validOptions = ['a', 'u', 'l'];
function isOptionPresent(opt) {
  for (var i = 0; i<validOptions.length; i++) {
    if (validOptions[i] == opt) {
      return true
    }
  }
  return false
}

for (var opt in commandEntered) {
  if (!isOptionPresent(opt)) {
    console.log('this command is not allowed')
    console.log('use these commands: ' + validOptions)
  }
}

另请注意,您可能希望更改行(添加):

代码语言:javascript
复制
if(commands.indexOf(commandEntered._[0]) > -1){

正如你在最后一句话中提到的那样,复杂的规则-如果简单,你可以逐一检查

代码语言:javascript
复制
if (commandEntered.a && !commandEntered.l) {
  console.log('you have to provide L command with A command')
}
if (commandEntered.n && 'string' !== typeof(commandEntered.n)) {
  console.log('command N must be followed with name of type string')
  console.log('e.g. -n myname')
}

如果可以做得更好,使用object而不是简单的数组,它也会定义参数的类型,所以你不会重复太多(然后你就不需要isOptionPresent()函数):

代码语言:javascript
复制
var validOptions = {'a':'boolean', 'n':'string', 'l':'boolean'};
for (var opt in commandEntered) {
  if (!validOptions[opt]) {
    console.log('this command is not allowed')
    console.log('use these commands: ' + Object.keys(validOptions))
  }
}

if (commandEntered.n && validOptions[opt] !== typeof(commandEntered.n)) {
  console.log('command N must be followed with name of type string')
  console.log('e.g. -n myname')
}

如果有许多复杂的规则,最好考虑一些结构来定义规则之间的关系,并检查传递的命令是否符合该结构。但我认为,这离你想要的太远了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27021844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档