Node.js 逐行读取
逐行读取
稳定性: 2 - 不稳定
使用 require('readline')
,可以使用这个模块。逐行读取(Readline)可以逐行读取流(比如process.stdin
)
一旦你开启了这个模块,node 程序将不会终止,直到你关闭接口。以下的代码展示了如何优雅的退出程序:
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("What do you think of node.js? ", function(answer) {
// TODO: Log the answer in a database
console.log("Thank you for your valuable feedback:", answer);
rl.close();
});
readline.createInterface(options)
创建一个逐行读取(Readline) Interface
实例. 参数 "options" 对象有以下值:
input
- 监听的可读流 (必填).output
- 逐行读取(Readline)数据要写入的可写流(可选).completer
- 用于 Tab 自动补全的可选函数。参见下面的例子。terminal
- 如果希望和 TTY 一样,对待input
和output
流,设置为 true。 并且由 ANSI/VT100 转码。默认情况下,检查isTTY
是否在output
流上实例化。
completer
给出当前行的入口,应该返回包含2条记录的数组
一个匹配当前输入补全的字符串数组
- 用来匹配的子字符串
最终像这样:[[substr1, substr2, ...], originalsubstring]
.
例子:
function completer(line) {
var completions = '.help .error .exit .quit .q'.split(' ')
var hits = completions.filter(function(c) { return c.indexOf(line) == 0 })
// show all completions if none found
return [hits.length ? hits : completions, line]
}
同时, completer
可以异步运行,此时接收到2个参数:
function completer(linePartial, callback) {
callback(null, [['123'], linePartial]);
}
为了接受用户输入,createInterface
通常和 process.stdin
,process.stdout
一起使用:
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
如果你有逐行读取(Readline)实例, 通常会监听"line"
事件.
如果这个实例参数 terminal
= true
,而且定义了 output.columns
属性,那么 output
流将会最佳兼容性,并且,当 columns 变化时(当它是 TTY 时,process.stdout
会自动这么做),会在 output
流上触发 "resize"
事件。
Class: Interface
代表一个包含输入/输出流的逐行读取(Readline)接口的类,
rl.setPrompt(prompt)
设置提示符,比如当你再命令行里运行 node
时,可以看到 node 的提示符 >
。
rl.prompt([preserveCursor])
为用户输入准备好逐行读取(Readline),将当前 setPrompt
选项方法哦新的行中,让用户有新的地方输入。设置 preserveCursor
为 true
,防止当前的游标重置为 0
。
如果暂停,使用 createInterface
也可以重置input
输入流。
调用 createInterface
时,如果 output
设置为 null
或 undefined
,不会重新写提示符。
rl.question(query, callback)
预先提示 query
,用户应答后触发 callback
。给用户显示 query 后,用户应答被输入后,调用 callback
。
如果暂停,使用 createInterface
也可以重置input
输入流。
调用 createInterface
时,如果 output
设置为 null
或 undefined
,不会重新写提示符。
例子:
interface.question('What is your favorite food?', function(answer) {
console.log('Oh, so your favorite food is ' + answer);
});
rl.pause()
暂停逐行读取(Readline)的 input
输入流, 如果需要可以重新启动。
注意,这不会立即暂停流。调用 pause
后还会有很多事件触发,包含 line
。
rl.resume()
恢复 逐行读取(Readline) input
输入流.
rl.close()
关闭 Interface
实例, 放弃控制输入输出流。会触发"close" 事件。
rl.write(data[, key])
调用createInterface
后,将数据 data
写到 output
输出流,除非 output
为 null
,或未定义undefined
。key
是一个代表键序列的对象;当终端是一个 TTY 时可用。
暂停 input
输入流后,这个方法可以恢复。
例子:
rl.write('Delete me!');
// Simulate ctrl+u to delete the line written previously
rl.write(null, {ctrl: true, name: 'u'});
Events
事件: 'line'
function (line) {}
input
输入流收到 \n
后触发,通常因为用户敲回车或返回键。这是监听用户输入的好办法。
监听 line
的例子:
rl.on('line', function (cmd) {
console.log('You just typed: '+cmd);
});
事件: 'pause'
function () {}
暂停 input
输入流后,会触发这个方法。
当输入流未被暂停,但收到 SIGCONT
也会触发。 (详见 SIGTSTP
和 SIGCONT
事件)
监听 pause
的例子:
rl.on('pause', function() {
console.log('Readline paused.');
});
事件: 'resume'
function () {}
恢复 input
输入流后,会触发这个方法。
监听 resume
的例子:
rl.on('resume', function() {
console.log('Readline resumed.');
});
事件: 'close'
function () {}
调用 close()
方法时会触发。
当 input
输入流收到 "end" 事件时会触发。一旦触发,可以认为 Interface
实例结束。例如当input
输入流收到 ^D
,被当做 EOT
。
如果没有SIGINT
事件监听器,当input
输入流接收到^C
(被当做SIGINT
),也会触发这个事件。
事件: 'SIGINT'
function () {}
当 input
输入流收到 ^C
时会触发, 被当做SIGINT
。如果没有SIGINT
事件监听器,当input
输入流接收到 SIGINT
(被当做SIGINT
),会触发 pause
事件。
监听 SIGINT
的例子:
rl.on('SIGINT', function() {
rl.question('Are you sure you want to exit?', function(answer) {
if (answer.match(/^y(es)?$/i)) rl.pause();
});
});
事件: 'SIGTSTP'
function () {}
Windows 里不可用
当 input
输入流收到 ^Z
时会触发,被当做SIGTSTP
。如果没有SIGINT
事件监听器,当input
输入流接收到 SIGTSTP
,程序将会切换到后台。
当程序通过 fg
恢复,将会触发 pause
和 SIGCONT
事件。你可以使用两者中任一事件来恢复流。
程切换到后台前,如果暂停了流,pause
和 SIGCONT
事件不会被触发。
监听 SIGTSTP
的例子:
rl.on('SIGTSTP', function() {
// This will override SIGTSTP and prevent the program from going to the
// background.
console.log('Caught SIGTSTP.');
});
事件: 'SIGCONT'
function () {}
Windows 里不可用
一旦 input 流中含有 ^Z并被切换到后台就会触发。被当做SIGTSTP
,然后继续执行 fg(1)
。程切换到后台前,如果流没被暂停,这个事件可以被触发。
监听 SIGCONT
的例子:
rl.on('SIGCONT', function() {
// `prompt` will automatically resume the stream
rl.prompt();
});
例子: Tiny CLI
以下的例子,展示了如何所有这些方法的命令行接口:
var readline = require('readline'),
rl = readline.createInterface(process.stdin, process.stdout);
rl.setPrompt('OHAI> ');
rl.prompt();
rl.on('line', function(line) {
switch(line.trim()) {
case 'hello':
console.log('world!');
break;
default:
console.log('Say what? I might have heard `' + line.trim() + '`');
break;
}
rl.prompt();
}).on('close', function() {
console.log('Have a great day!');
process.exit(0);
});
readline.cursorTo(stream, x, y)
在TTY 流里,移动光标到指定位置。
readline.moveCursor(stream, dx, dy)
在TTY 流里,移动光标到当前位置的相对位置。
readline.clearLine(stream, dir)
清空 TTY 流里指定方向的行。dir
是以下值:
-1
- 从光标到左边1
- 从光标到右边0
- 整行
readline.clearScreenDown(stream)
清空屏幕上从当前光标位置起的内容。
Node.js 逐行读取的更多相关文章
- node.js在读取文件时中文乱码问题
断更很久了........从今天开始会努力的持续更博,积极学习. 言归正传.今天在写node.js的demo时发现一个bug.我在node中读取本地的text文件时,发现英文的内容可以被读取,但是中文 ...
- node.js如何读取MySQL数据
先安装mysql模块. node.js默认安装时,模块文件放在 /usr/local/lib/node_modules 这个目录下,为了便宜管理,模块还是统一安装到这里好. $ cd /usr/loc ...
- Node.js中读取文件后用Json.parse方法报错
今天,在调试一个node项目时,发现了一个很大的坑,在此分享给大家! 大家都知道,Json.parse()方法对格式要求是很严格的,格式不对极其容易报错,但是有时候格式看似是正确的也会报错. 比如这一 ...
- Node.js中读取文件后用Json.parse方法报错解决方案
今天,在调试一个node项目时,发现了一个很大的坑,在此分享给大家! 大家都知道,Json.parse()方法对格式要求是很严格的,格式不对极其容易报错,但是有时候格式看似是正确的也会报错. 比如这一 ...
- node.js同步读取与异步读取文件
- 极简 Node.js 入门 - 3.2 文件读取
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- [js高手之路]node js系列课程-创建简易web服务器与文件读写
web服务器至少有以下几个特点: 1.24小时不停止的工作,也就是说这个进程要常驻在内存中 2.24小时在某一端口监听,如: http://localhost:8080, www服务器默认端口80 3 ...
- Node.js 项目的配置文件
在 Node.js 中可以通过process.env来访问当前的环境变量信息,比如: { PATH: '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', T ...
- node.js守护进程问题的解决
最近自己写了一个node.js来读取redis数据,编写完成后按理来说加& 应该是有效的 nohup node redis.js & 但是每次关闭终端后这个进程就自动停止了,百度了下 ...
随机推荐
- 消息队列的使用 RabbitMQ (二): Windows 环境下集群的实现
一.RabbitMQ 集群的基本概念 一个 RabbitMQ 中间件(broker) 由一个或多个 erlang 节点组成,节点之间共享 用户名.虚拟目录.队列消息.运行参数 等, 这个 节点的集合被 ...
- scrollTop doesn't scroll on Chrome 61
在chrome61 不支持滚动 解决方案: Use document.scrollingElement if supported, and fall back to the current code. ...
- requests+正则爬取豆瓣图书
#requests+正则爬取豆瓣图书 import requests import re def get_html(url): headers = {'User-Agent':'Mozilla/5.0 ...
- requests-get请求
import requests response= requests.get('http://www.baidu.com')#get方法请求网址 print(response) print(respo ...
- 单例模式详解及java常用类
[单例模式] 确保某一个类,只能产生一个实例. 设计思路: ====将构造函数私有化,确保类外部,不能使用new关键字自行创建对象. ====在类内部实例化一个对象,并通过静态方法返回. ( ...
- requests之一:HTTP OAUTH认证(1)图形解释流程
- ios、移动端 input type=date无法点击的问题解决方法
正常用input type = "text",获取焦点的时候,将type 改成 date即可. <div class="form-item"> &l ...
- 认识JQuery,JQuery的优势、语法、多库冲突、JS原生对象和JQuery对象之间相互转换和DOM操作,常用的方法
(一)认识JQuery JQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一套定义好的方法 JQuery的主旨:以更少的代码,实现更多的功能 (二)JQue ...
- 合并两个list,不包含重复的对象
package com.compare.test; import java.util.ArrayList;import java.util.Collections;import java.util.L ...
- XMLHTTPRequestObject获取服务器数据
http://www.educity.cn/develop/526316.html 在Web客户端使用xmlhttp对象,可以十分方便的和服务器交换数据,我们可以获取和发送任何类型的数据,甚至二进制数 ...