node.js process.stdout.write TypeError

时间:2017-06-27 12:00:18

标签: javascript node.js stdout

我正在开发一个简单的函数来在node.js中创建基于控制台的提示,而无需使用一堆额外的库:

“““

function prompt(text, callback) { // Text can be a question or statement.
    'use strict';
    var input, output;

    process.stdout.write(text + ' ');
    process.stdin.addListener('readable', function read() { // Stream type *must* be correct!
        input = process.stdin.read();
        if (input) { // Wait for actual input!
            output = input.toString().slice(0, -2); // Slicing removes the trailing newline, an artifact of the 'readable' stream type.
            process.stdout.write('You typed: ' + output);
            process.stdin.pause(); // Stops waiting for user input, else the listener keeps firing.
            callback(output);
        }
    });
}

prompt('Enter some text:', process.stdout.write);
// Enter some text: x
// You typed: x_stream_writable.js:200
//   var state = this.writableState;
//
// TypeError: Cannot read property '_writableState' of undefined
//     ...

”””

根据问题nodejs: shore alias for process.stdout.write,从别名调用时,“{”this“”“可能未定义。但是,我没有使用别名,而是直接调用“”process.stdout.write“”“。第一个实例,在“”{“1}}”“”函数内,工作正常但第二个实例,作为回调的一部分,却没有。甚至更奇怪的是“”{“read()”“”如果我在回调的第二个实例中替换它就可以正常工作,尽管它应该仅仅是“console.log”“”的包装器。功能。如何将“”process.stdout.write“”“绑定到字符串”“this”“”或者,如果那不可行,我还能做些什么来解决错误“ “‘output’””?

1 个答案:

答案 0 :(得分:3)

调用process.stdout.write()时,期望绑定到process.stdout对象。

您可以简单地绑定作为回调传递的函数:

prompt('Enter some text:', process.stdout.write.bind(process.stdout));

此外,您的输入slice(0,-2)在Linux上不起作用(因为换行符只有一个字符' \ n'而不是Windows' \ r \ n') - 使用input.toString().trim()或查找os.EOL以获得更多与操作系统无关的方法可能更容易。