起步
var http = require('http');
http.createServer(function(request, response){
response.writeHead(200, { 'content-type': 'text/plain' });
response.end("hello world\n")
}).listen(3000);
console.log("server running at http://localhost:3000/")
IO操作
var fs = require('fs');
fs.readFile('something.txt', function(error, data){
if(error)
console.error(error);
else
console.log(data.toString());
});
fs.writeFile
事件循环
![事件循环](https://i-blog.csdnimg.cn/blog_migrate/55c9aa14472b9a4c06326a32f09e9a50.png)
- node使用一个事件循环来监听事件,当出现了对应事件时,调用回调函数:
var events = require('events');
var eventEmitter = new events.EventEmitter();
eventEmitter.on('click', () => {
console.log('this is click event!');
});
eventEmitter.emit('click');
- 事件监听类型:
- on、addListener:每次都会监听事件
- once:只会监听一次事件
- removeListener[eventName, callback]:移除指定name事件的监听数组的指定事件监听器
- removeAllListeners[eventName]:移除所有事件监听器或指定name的监听器
- error:事件监听出错的时候会触发的事件对象,当出错的时候会退出node进程,所以最好对 error 事件进行监听
- 事件监听器会对所有注册在其上的事件处理程序,进行同步调用
缓冲区
- js没有二进制数据类型,所以 node 读取图片或者二进制流的时候,会使用 buffer 来存储二进制数据
- 使用:
var buff = Buffer.from('123')
console.log(buff.toString('utf8'));
- Buffer.from()、Buffer.alloc()、Buffer.allocUnsafe() 的区别:
- Buffer.from() 接受字符串、buffer对象、数组等,返回一个新的缓存区
- Buffer.alloc() 会创建一个未初始化的缓存区,可能会存在敏感数据
- Buffer.allocUnsafe() 会创建一个初始化了的缓存区,速度比 alloc() 慢
- buffer 迭代:
var buff = Buffer.from([1, 2, 3]);
for(const b of buff)
console.log(b);
流
- 流是 node 处理流式数据的抽象接口
- 流的种类:
- writable:可读流
- readable:可写流
- duplex:即可读又可写的流(双工)
- transform:在读写过程中可以修改或转换数据的双工流
- 使用(假如使用的txt,记得修改默认编码方式):
var fs = require('fs');
var data = '';
var readableStream = fs.createReadStream('something.txt');
readableStream.setEncoding = 'UTF8';
readableStream.on('data', (chunk) => {
data += chunk;
});
readableStream.on('end', () => {
console.log(data);
});
readableStream.on('error', (err) => {
console.error(err);
});
var writableStream = fs.createWriteStream('another.txt');
writableStream.write('第二句话', 'UTF8');
writableStream.end();
writableStream.on('finish', () => {
console.log("写入完成");
});
writableStream.on('error', (err) => {
console.error(err);
})
- 可写流事件:
- close:当流关闭的时候触发的事件,表示这个流不会再触发任何事件了
- drain:当可写流缓存满了的时候,会将 stream.write(chunk) 设为 false,此时最好停止写入数据,直到缓存清空(排干),会触发 drain 事件,这时可以继续写入数据
- error:写入流出错时的事件
- finish:调用 stream.end(),且缓存数据都已交给底层浏览器后触发
- pipe:在可读流上调用 stream.pipe() 时触发
- unpipe:在可读流上调用 stream.unpipe() 时触发,可读流通过管道流向可写流出错时也会触发
- 可读流事件:
- close:同上
- data:当流将数据块传送给消费者后触发
- end:当流中没有数据后触发
- error:同上
- readable:当流中有数据可读的时候触发
- 使用管道:
var fs = require('fs');
var readStream = fs.createReadStream('something.txt');
var writeStream = fs.createWriteStream('another.txt');
readStream.pipe(writeStream);
模块系统
- node中,每个文件都被视为独立的模块
- 使用 require 加载模块的优先顺序:
![导入模块](https://i-blog.csdnimg.cn/blog_migrate/7d2e36477bd1df87031b86b84cc06957.png)