我正在开发一个简单的函数来在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
’””?
答案 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
以获得更多与操作系统无关的方法可能更容易。