nodejs复习05
stream
可读流
fs.pause()方法会使处于流动模式的流停止触发data事件,切换到非流动模式并让后续数据流在内部缓冲区
var fs = require('fs')
var rs = fs.createReadStream('2.txt');
rs.setEncoding('utf8')
//当一个数据快可以从流中被读出触发
rs.on('readable', function () {
console.log('readable event');
})
//读取数据块时操作
rs.on('data', function (chunk) {
console.log('data event');
rs.pause(); //停止
setTimeout(function () {
rs.resume() //恢复
console.log(chunk);
}, 3000)
})
//数据接收发生错误时
rs.on('error', function (err) {
console.log('error event');
})
//没有更多数据能够提供时
rs.on('end', function () {
console.log('end event');
})
//底层数据源(如数据源文件描述符)被关闭时触发
//注意不是所有流都会触发
rs.on('close', function () {
console.log('close event');
})
- 可读流有两种模式: 流动模式和暂停模式,暂停模式必须明确调用
stream.read(size)方法,默认流动模式 read发明合法用语从内部缓存区中读取并返回数据;没有设置size则一次返回所有缓冲区数据read方法仅在暂停模式时被调用,流动模式会自动调用
//暂停模式,无需再设置data事件,readable会被调用两次
rs.on('readable', function () {
console.log('readable event');
var chunk
while((chunk = rs.read()) !== null) {
console.log(chunk)
}
})
使用可读流发送数据
- 可读流在接收者么哦呦读取数据之前会缓存所有压入的数据
var stream = require('stream')
var rs = new stream.Readable
rs.push('Stream') //发送数据
rs.push('Readable')
rs.push('Push()')
rs.push('Pipe()')
rs.push('\n')
rs.push(null) //通知发送数据完毕
rs.pipe(process.stdout) //pipe方法导出数据
pipe方法
- 使用
pipe时回自动调用data/end事件
//复制文件
var readable = fs.createReadStream('a.js');
var writeable = fs.createWriteStream('c.js');
readable.pipe(writeable)
unpipe方法
- 会解除之前调用
pipe所设定的流;
var readable = fs.createReadStream('a.js');
var writeable = fs.createWriteStream('c.js');
readable.pipe(writeable)
//指定了目标c.js文件会变空白
readable.unpipe(writeable);
writeable.end()
//指定了目标但没有建立导流, 不会影响
setTimeout(function (){
readable.unpipe(writeable);
writeable.end()
}, 100)
可写流
ws.write方法向底层系统写入数据,并在数据被处理完毕后调用回调函数;如果数据滞留在内部则返回false
var fs = require('fs')
var ws = fs.createWriteStream('1.txt');
ws.write('stream-');
ws.write('writable-');
ws.write('file-');
ws.end('end\n')
两者共同使用
var fs = require('fs')
var rs = fs.createReadStream('a.js');
var ws = fs.createWriteStream('1.txt');
rs.setEncoding('utf8')
rs.on('data', function (chunk) {
if(ws.write(chunk) === false) rs.pause()
})
ws.on('drain', function () {
rs.resume()
})
//ws.end被调用且所有数据已经被写入底层系统
ws.on('finish', function() {
console.log('ws finish');
})
rs.on('end', function () {
ws.end()
})
http
http服务器
var http = require('http')
var url = require('url')
http.createServer(function (req, res) {
var pathname = url.parse(req.url).pathname
if(pathname === '/') {
res.writeHead(200, {'Content-Type': 'text/html'})
res.write('<h3>Nodejs-Http</h3>')
res.end('<p>Create Basic HTTP Server!</p>')
} else {
res.writeHead(301, {'Location':'/'})
res.end()
}
}).listen(3000)
setHeader/getHeader:setHeader方法用于读取一个在队列中但没有被发送至客户端的headerwriteHeade方法只能在当前请求中使用一次,必须在write/end之前调用
http客户端
var http = require('http')
var options = {
hostname: '127.0.0.1',
port: 3000,
path: '/',
method: 'get'
}
var req = http.request(options, function (res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8')
var body = ''
res.on('data', function (chunk) {
body += chunk
})
res.on('end', function () {
console.log('BODY: ' + body);
})
})
req.on('error', function (err) {
console.log('err: ' + err);
})
req.write('data\n')
req.end()
- 简化
get调用:http.get(url, callback)
util
格式化字符串
util.format(format. args)
%s
%d
%j
nodejs复习05的更多相关文章
- nodejs复习02
process 这个模块是单线程的,无法完全利用多核CPU 基本信息 //程序目录 process.cwd(); //应用程序当前目录 process.chdir('/home'); //改变应用程序 ...
- nodejs复习01
console 格式化 console.log("%s:%s", "a", "b") //字符串 console.log("%d. ...
- nodejs复习04
TCP/UDP网络应用 创建TCP服务器客户端 socket套接字对象实例,是对TCP协议的一个基本封装接口 clientt套接字对象实例 //server.js var net = require( ...
- nodejs复习03
文件系统fs 重命名 fs.rename() fs.renameSync 优先选择异步,可以进行异常判断 打开关闭文件 fd = fs.openSync(file, flags) fs.closeSy ...
- nodeJs学习-05 案例:http/fs/querystring/url
const http = require('http'); const fs = require('fs'); const querystring = require('querystring'); ...
- 编译原理--02 自顶向下、自底向上的LR分析复习(清华大学出版社第3版)
前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 第4章 自顶向下的语法分析方法 确 ...
- 编译原理--05 用C++手撕PL/0
前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 05 用C++手撕PL/0 在之前 ...
- Nodejs in Visual Studio Code 05.Swig+Bootstrap
1. 开始 准备好Express+Swig的练习代码:https://github.com/Mengkzhaoyun/nodepractise 准备好AdminLTE后台管理模版:https://ww ...
- Angular4+NodeJs+MySQL 入门-05 接口调用
接口调用 今天讲一下,如果在前端页面上通过调用后台接口,返回来的数据.把前面的几章结合起来. 这里所有用的代码在 https://github.com/xiaotuni/angular-map-htt ...
随机推荐
- Entity framewok 如何实现多条记录作为一条取出, for xml path如何实现
http://www.myexception.cn/linq/1288046.html Entity framewok 怎么实现多条记录作为一条取出, for xml path怎么实现News表:ID ...
- 第一次做socket的一些心得
理论什么的bilibala的就是自己百度吧 推荐一篇不错的关于socket的文章 http://www.cnblogs.com/sunway/archive/2010/01/29/1659074.ht ...
- Java 中文乱码问题总结
开发java应用出现乱码是很常见的,毕竟现在unicode的使用还不是很广泛,在使用gb2312(包含了gbk简体,big5繁体)的系统中要正确 实现中文的display和数据库的存储是最基本的要求. ...
- CSS3 Media Queries 实现响应式设计
在 CSS2 中,你可以为不同的媒介设备(如屏幕.打印机)指定专用的样式表,而现在借助 CSS3 的 Media Queries 特性,可以更为有效的实现这个功能.你可以为媒介类型添加某些条件,检测设 ...
- CSS Sprites优缺点
利用CSS Sprites能很好地减少网页的http请求,从而大大的提高页面的性能,这也是CSS Sprites最大的优点,也是其被广泛传播和应用的主要原因: CSS Sprites能减少图片的字节, ...
- C++ 之namespace常见用法
一.背景 需要使用Visual studio的C++,此篇对namespace的常用用法做个记录. 二.正文 namespace通常用来给类或者函数做个区间定义,以使编译器能准确定位到适合的类或者函数 ...
- 仅用aspx文件实现Ajax调用后台cs程序。(实例)
仅用aspx文件实现Ajax调用后台cs无刷新程序.(实例) 两个文件:aaa.aspx 和aaa.aspx.cs 一.aaa.aspx <script type="text/java ...
- PHP代码 如何网页获取用户的openid
public function getOpenid($appid, $appsecret) { $SERVER_NAME = $_SERVER['SERVER_NAME']; $REQUEST_URI ...
- BZOJ 2093: [Poi2010]Frog
Description 从一个点到达与他距离第 \(k\) 小的点,问从每个点跳 \(m\) 次到达那个点. Sol 队列+倍增. 保持队列里的元素个数为 \(k\) ,从前往后扫不难发现左右端点都是 ...
- 项目管理的一些Tip
最近带领了一个大概150人天的项目,做一些备注: 1, 知人善用. 排期分任务的时候,要先了解每个团队成员的特点,包括技术水平.性格,看他是适合做技术难度大的模块还是适合做业务逻辑复杂的模块. 2, ...