我正在尝试从节点中的控制台同步读取参数,我设法执行以下操作:
var load = function () {
const BUFFER_LENGTH = 1024;
const stdin = fs.openSync('/dev/stdin', 'rs');
const buffer = Buffer.alloc(BUFFER_LENGTH);
console.log('Provide parameter: ');
fs.readSync(stdin, buffer, 0, BUFFER_LENGTH);
fs.closeSync(stdin);
return buffer.toString().replace(/n*/, '');
}
它有效,但这里有一件奇怪的事情:
var loadedValue = load();
console.log(loadedValue); // displays "a", if I typed "a", so the result is correct
console.log({loadedValue}); // displays {a: 'anu0000u0000....'}
当我将值包装在一个对象中时,剩余的 BUFFER 位显示在一个字符串中。为什么?我怎样才能摆脱它们?在创建对象之前对字符串进行正则表达式不起作用。
Buffer.alloc(BUFFER_LENGTH)
创建一个特定长度的缓冲区(在您的例子中为 1024(,并用 NULL 字符填充该缓冲区(如此处所述(。
接下来,您将一些(例如 2(个字节从 stdin 读取到该缓冲区中,这会将前两个 NULL 字符替换为从 stdin 读取的字符。缓冲区的其余部分仍由 NULL 组成。
如果不将缓冲区截断为读取的字节数,则函数将返回长度为 1024 的缓冲区,其中大部分由 NULL 填充。由于这些是不可打印的,所以它们不会出现在第一个console.log()
,但它们仍然存在。
因此,从 stdin读取后,您应该将缓冲区截断为正确的大小:
let bytesRead = fs.readSync(stdin, buffer, 0, BUFFER_LENGTH);
buffer = buffer.slice(0, bytesRead);