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方法用于读取一个在队列中但没有被发送至客户端的header
  • writeHeade方法只能在当前请求中使用一次,必须在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的更多相关文章

  1. nodejs复习02

    process 这个模块是单线程的,无法完全利用多核CPU 基本信息 //程序目录 process.cwd(); //应用程序当前目录 process.chdir('/home'); //改变应用程序 ...

  2. nodejs复习01

    console 格式化 console.log("%s:%s", "a", "b") //字符串 console.log("%d. ...

  3. nodejs复习04

    TCP/UDP网络应用 创建TCP服务器客户端 socket套接字对象实例,是对TCP协议的一个基本封装接口 clientt套接字对象实例 //server.js var net = require( ...

  4. nodejs复习03

    文件系统fs 重命名 fs.rename() fs.renameSync 优先选择异步,可以进行异常判断 打开关闭文件 fd = fs.openSync(file, flags) fs.closeSy ...

  5. nodeJs学习-05 案例:http/fs/querystring/url

    const http = require('http'); const fs = require('fs'); const querystring = require('querystring'); ...

  6. 编译原理--02 自顶向下、自底向上的LR分析复习(清华大学出版社第3版)

    前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 第4章 自顶向下的语法分析方法 确 ...

  7. 编译原理--05 用C++手撕PL/0

    前言 目录 01 文法和语言.词法分析复习 02 自顶向下.自底向上的LR分析复习 03 语法制导翻译和中间代码生成复习 04 符号表.运行时存储组织和代码优化复习 05 用C++手撕PL/0 在之前 ...

  8. Nodejs in Visual Studio Code 05.Swig+Bootstrap

    1. 开始 准备好Express+Swig的练习代码:https://github.com/Mengkzhaoyun/nodepractise 准备好AdminLTE后台管理模版:https://ww ...

  9. Angular4+NodeJs+MySQL 入门-05 接口调用

    接口调用 今天讲一下,如果在前端页面上通过调用后台接口,返回来的数据.把前面的几章结合起来. 这里所有用的代码在 https://github.com/xiaotuni/angular-map-htt ...

随机推荐

  1. struts2 spring mybatis 整合(test)

    这几天搭了个spring+struts2+mybatis的架子,练练手,顺便熟悉熟悉struts2. 环境:myEclipse10+tomcat7+jdk1.6(1.8的jre报错,所以换成了1.6) ...

  2. socket 函数

    1.创建套接字并返回一个描述符,该描述符可以用来访问套接字 #include<sys/types.h> #include<sys/socket.h>  int socket(i ...

  3. 2016icpc大连站总结(呐 如果把这段回忆,起个名字珍藏起来,叫它“宝物”应该很合适吧)

    10月15号一早乘飞机去了大连,12点这样到了海事大学,是一所很大的学校,来往的学生有些穿着海军服.然后我们到体育馆领了衣服,就去食堂吃午饭,中间有段小插曲,就是我们队的餐券没领..不过那里的负责人让 ...

  4. java从基础知识(八)泛型

    1.什么是泛型? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法 ...

  5. OpenCV笔记大集锦(转载)

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

  6. angular路由详解:

    1.$routeProvider ngRoute模块中的服务 2.otherwise:设置用于路由改变时,与任何其他定义的路由无法匹配的时候执行的代码 3.when:为$route服务定义新的路由 例 ...

  7. 利用chrome插件批量读取浏览器页面内容并写入数据库

    试想一下,如果每天要收集100页网页数据甚至更多.如果采用人工收集会吐血,用程序去收集也就成为一个不二的选择.首先肯定会想到说用java.php.C#等高级语言,但这偏偏又有个登陆和验证码,搞到无所适 ...

  8. Unity3D 原生Android结合UnityPlayerActivity开发遇到的问题

    需求是原生Android 的Activity启动UnityPlayerActivity,按Back键后返回原来的Activity 1.在AndroidManifest.xml中的UnityPlayer ...

  9. SemanticZoom配合GridView组件的使用关键点

    1,SemanticZoom 有两个重要属性 默认值ZoomedInView(不设置的话,默认显示,包括分类名和分类成员)和ZoomedOutView(这个是缩小后的目录,只要包括分类名,点击跳到对应 ...

  10. android studio2.2 的Find Sample Code点击没有反应

    1 . 出现的问题描述:           右键点击Find Sample Code后半天没有反应,然后提示 Samples are currently unavailable for :{**** ...