新手的一个Nodejs process.stdin的问题,请大神指导

新手的一个Nodejs process.stdin的问题,请大神指导

process.stdin.resume(); process.stdin.setEncoding(‘utf8’); process.stdin.on(‘data’,function(chunk){ process.stdout.write('data: '+chunk); if(chunk===‘bye’){ process.stdin.emit(‘end’); } }); process.stdin.on(‘end’,function(){ process.stdout.write(‘end!!!’); });

在学习stdin时,在控制台中输入bye后,在if语句的判断中始终为false,不能响应end事件。打印看chunk接收到的是bye,不知道为什么,请大神指导


5 回复

当然可以!根据你提供的代码片段和描述的问题,让我们一起来分析并解决这个问题。

问题分析

你在if语句中使用了三个等号(===),这表示严格相等比较。这意味着不仅值需要相同,而且数据类型也需要相同。在这个例子中,chunk是从process.stdin读取的数据,它是一个字符串。因此,当你在if语句中写chunk === 'bye'时,你需要确保chunk确实是一个字符串,并且值为'bye'

示例代码

下面是修改后的代码,包括一些调试信息,以帮助理解问题所在:

process.stdin.resume();
process.stdin.setEncoding('utf8');

console.log("请输入文字,输入'bye'来结束");

process.stdin.on('data', function(chunk) {
    console.log(`Received data: ${chunk}`); // 打印接收到的数据
    process.stdout.write('data: ' + chunk);

    if (chunk.trim() === 'bye') { // 使用trim()去除可能存在的空白字符
        console.log("Detected 'bye'");
        process.stdin.emit('end');
    }
});

process.stdin.on('end', function() {
    process.stdout.write('end!!!');
});

关键点解释

  1. 使用 trim() 方法:用户输入可能会包含空格或换行符,因此我们使用chunk.trim()来移除这些额外的空白字符,确保比较时不会因为这些字符而失败。
  2. 调试输出:通过添加console.log语句,我们可以看到实际接收到的数据,有助于定位问题。
  3. 严格相等比较chunk.trim() === 'bye' 确保我们只在接收到确切的 'bye' 字符串时才触发end事件。

运行结果

当你运行这段代码并在控制台输入bye时,你会看到类似以下的输出:

请输入文字,输入'bye'来结束
Received data: bye
Detected 'bye'
end!!!

这样,你就能够正确地检测到用户输入的bye并触发相应的end事件了。希望这能解决你的问题!


if (chunk === ‘bye\n’)

还是不正确呀,依然为false

thunk.trim() === ‘bye’

在你的代码中,问题出在字符串引号的使用上。你在使用引号时用了中文的全角引号(‘ ’),而不是英文半角引号(’ ')。这会导致JavaScript无法正确识别字符串。

以下是修正后的代码:

process.stdin.resume();
process.stdin.setEncoding('utf8');

process.stdin.on('data', function(chunk) {
    process.stdout.write('data: ' + chunk);
    if (chunk.trim() === 'bye') { // 使用trim去除可能存在的空白字符
        process.stdin.emit('end');
    }
});

process.stdin.on('end', function() {
    process.stdout.write('end!!!');
});

解释:

  1. 引号修正:将全角引号替换为半角引号。
  2. trim() 方法:为了确保即使用户输入了空格或换行符,也能正确检测到 bye,可以使用 chunk.trim() 去除首尾的空白字符。

现在你应该能在输入 bye 后触发 end 事件,并且看到输出 end!!!

回到顶部