Node.js中模拟shell read命令实现人机交互
发布于 10 年前 作者 xiaofeng748 11048 次浏览 最后一次编辑是 8 年前

最近使用node写一个项目,其中有需要接受用户在终端的输入需求。
咋一看就是简单的读取用户键盘输入,在shell的read或者dos的set /p就可以简单的搞定。
但在node中却没有那么的容易,为了实现这个功能踩了许多坑。

首先,做任何事前都需要问下谷哥!运气还算不错,找到一个解决方案:

var fs = require('fs');  
function readSyn() {  
    process.stdin.pause();  
    var response = fs.readSync(process.stdin.fd, 1000, 0, "utf8");  
    process.stdin.resume();  
    return response[0].trim();  
}

试了下,妥妥的,看起来是没问题了!但一切是否太过于顺利了?不出所料,代码转移到linux下就悲剧了,fs.readSync时报错了,unkonwn error!看来对于node来说跨平台也不能做到面面俱到!
这个时候注意到process.stdin这个对象,由于很少使用process所以对他的属性也不是很熟悉!
查阅了相关资料后发现process.stdin是个流对象(Steam),继承自EventEmitter,有data,end事件。ok!有了这些这下好办了。

function read(prompt, callback) {
    process.stdout.write(prompt + ':');
    process.stdin.resume();
    process.stdin.setEncoding('utf-8');
    process.stdin.on('data', function(chunk) {
        process.stdin.pause();
        callback(chunk);
    });
}

process.stdin.resume
这个函数用来恢复对标准输入的读取,调用后在终端里每输入一行就会触发stdin的data事件

process.stdin.pause
这个函数暂停对标准输入的读取,执行后对终端的任何输入都不会出发stdin.data事件。

经过测试,这段代码在window、linux、OS X下完美运行。
node version: 0.10.21

1 回复

可以试试直接用readline

回到顶部