最近使用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
可以试试直接用readline