Npm提示 - 自定义验证和多行消息?

时间:2015-10-23 13:06:10

标签: javascript node.js prompt

我正在开发一个CLI程序,基于nodejs和npm包"提示"。 假设我想要这个提示,将输入放在变量pet

Choose a pet:
(1) - Cat
(2) - Dog
(3) - Fish
(4) - Rabbit
(5) - Rat
: > 

基本上我做了功能,但我遇到了以下问题:

  1. 如果我使用conform功能进行自定义验证,那么我的自定义消息 - 多行文字 - 永远不会出现。变量的名称 - pet - 仅出现。但我希望进行验证,因为我想确保用户不会输入333

  2. 如果我删除了conform自定义验证 - 我可以使用多行文字,但接下来会发生其他事情:闪烁的矩形,其中输入发生,与多行文字重叠。而且我无法在多行消息的最后一行之后设置blink

  3. (在上面的示例中,闪烁发生在数字5上。)

    知道如何解决我遇到的两个问题吗? ...... :)

    ==================编辑:添加代码示例===================

    这是我生成多行文字的方式:

    // generate the multiline text .. 
    var petsMessage = 'Choose a pet: \n';
    var pets = [...];
    for(var i = 0, l = pets.length; i < l; i++) {
        petsMessage += ' (' + (i+1) + ') - ' + pets[i] + "\n";
    }
    

    这是我使用多行文字生成提示的方法,但没有验证:

    // define the prompt stuff .. 
    var promptInfo = {
        properties: {
            Pet: {
                message: petsMessage,
                required: true
            },
        }
    };
    

    这是验证,但多行消息不起作用:

    // define the prompt stuff .. 
    var promptInfo = [
        {
            name: 'Pet',
            message: petsMessage,
            required: true,
            conform: function(value) {
    
                value = parseInt(value);
    
                if(value > 0 && value < pets.length) {
                    return true;
                } else {
                    return false;
                }
            }
        }
    ];
    

2 个答案:

答案 0 :(得分:2)

我认为问题在于,在第二个带有验证的片段中,您在message属性中指定了实际问题,您应该在说明中指定它。 message属性引用错误消息。请试试这个:

var petsMessage = 'Choose a pet: \n';
var pets = ["dog","cat","frog"];
for(var i = 0, l = pets.length; i < l; i++) {
    petsMessage += '\t (' + (i+1) + ') - ' + pets[i] + "\n";
}
var prompt = require('prompt');
var promptInfo = [
    {
        name: 'Pet',
        description: petsMessage,
        required: true,
        message: 'Options allowed:: 1'+'-'+pets.length,
        conform: function(value) {

            value = parseInt(value);

            return value > 0 && value <= pets.length

        }
    }
];

prompt.start();

prompt.get(promptInfo, function (err, result) {
    console.log('you Choose',result,'::::',pets[result.Pet-1])
});

答案 1 :(得分:0)

实际上,“alex-rokabills”的解决方案也并不完美:( ......它肯定更好,但我仍然看到问题。

如果我使用少量商品,那就没关系:

Maximum five items

但如果数字增长一点点:

Six or more items

对于大提示:

Over 10 items

另外 - 我可以在开头摆脱“提示:”吗? ......