github文章连接:https://github.com/Vibing/blo...node
学习nodejs必需要掌握其核心,就像学JavaScript必须掌握函数、对象、数据类型、BOM、DOM等。git
nodejs
核心也很多,这里介绍几个核心:Events模块、fs模块、stream的使用、http模块。程序员
事件驱动、非阻塞异步IO是nodejs的特色,因此Events是很是重要的模块。而且node
中绝大多数模块都继承了Events
。github
事件是发布订阅模式的实现。在浏览器中,好比click
事件json
$('button').on('click',()=>{ //处理click响应 })
固然你也能够自定义事件:api
//自定义事件 $('div').bind('hello',()=>{ alert('hello') }); //触发事件 $('div').trigger('hello');
那么在 node 中如何使用 Events 模块的呢?
咱们定义一个类,让它继承 Events数组
const EventEmit = require('events'); //定义一个播放器类 class Player extends EventEmit { } const player = new Player(); //定义播放事件 player.on('play', ( param )=>{ console.log(`播放器播放《${param}》`) }) play.emit('play','海阔天空'); // 播放器播放《海阔天空》 play.emit('play','七里香'); // 播放器播放《七里香》
若是你想让事件只执行一次,可使用 once :浏览器
//定义播放事件 player.once('play', ( param )=>{ console.log(`播放器播放《${param}》`) }) play.emit('play','海阔天空'); play.emit('play','七里香');
此时 只会打印出 播放器播放《海阔天空》服务器
上面也说了 node 中绝大多数模块都继承了 Events,好比 stream、fs、http等等,它们就像浏览器里的 click,是原生就有的,若是你接着往下看 会对发现不少用到事件的地方。网络
fs 全拼是 file system
即文件系统。
既然是文件系统,它的主要做用就是操做文件,好比文件的新增、修改内容、读写文件内容等。
查看文件夹信息
fs.stat('./logs', (err, stats) => { if (err) { console.log(err); return; } console.log('目录:', stats.isDirectory()); console.log('文件:', stats.isFile()); console.log('大小:', stats.size); }); //打印结果 目录: true 文件: false 大小: 160
查看文件信息
fs.stat('./fs.js', (err, stats) => { if (err) { console.log(err); return; } console.log('目录:', stats.isDirectory()); console.log('文件:', stats.isFile()); console.log('大小:', stats.size); }); //打印结果 目录: false 文件: true 大小: 2087
// 建立目录 fs.mkdir("./logs", err => { if (err) { console.log(err); return; } console.log("logs目录建立成功"); });
fs.mkdir
是异步方法,若是你想同步建立可使用 fs.mkdirSync
fs.mkdirSync('./logs2'); //同步建立文件夹
fs.writeFile('./logs2/hello.log', '你好~', err => { if (err) { console.log(err); return; } console.log('写入成功'); });
注意: 若文件不存在则建立文件 若文件中有内容则覆盖
有时候咱们不但愿内容被覆盖,而是追加,那么可使用 appendFile 方法。
fs.appendFile("./logs/hello.log", "hello~\n我是程序员", err => { if (err) { console.log(err); return; } console.log("写入成功"); });
// 读取文件内容 fs.readFile("./logs/hello.log", "utf8", (err, stats) => { if (err) { console.log(err); return; } console.log(stats); });
// 读取文件夹 fs.readdir("./logs", (err, files) => { if (err) { console.log(err); return; } console.log(files); //返回一个包含全部文件名称的数组 }); //打印结果 [ 'data-write.json', 'data.json', 'traking.log' ]
// 修更名称 把hello.log修改成tranking.log fs.rename("./logs/hello.log", "./logs/traking.log", err => { if (err) { console.log(err); return; } console.log("更名成功"); });
// 删除目录下文件 fs.readdirSync("./logs").map(file => { // 删除文件unlink fs.unlink(`./logs/${file}`, err => { if (err) { console.log(err); return; } console.log("文件删除成功"); }); });
// 只能删除空目录 若目录里不为空则会报错 因此要先删除里面的文件 再删除文件夹 fs.rmdir("./logs", err => { if (err) { console.log(err); return; } console.log("目录删除成功"); });
流,可理解为水流。只不过这里是数据流。
流的意义在于三点:
const fs = require('fs'); const fileReadStream = fs.createReadStream('./logs/data.json'); const fileWriteStream = fs.createWriteStream('./logs/data-write.json'); /* 经过文件流的事件方式 */ fileReadStream.on('data', chunk => { fileWriteStream.write(chunk); // 可写流写入文件 若是文件不存在则建立文件 }); fileReadStream.on('error', err => { console.log('错误:', err); }); fileReadStream.on('end', () => { console.log('结束'); });
上面代码中创建了一个流:可读流--->可写流。它知足了上面说的三点:有源头(可读流)、有终点(可写流)、从源头到终点(一个文件里的数据流到了另外一个文件里)。
代码中也能看出,Stream 其实也继承了 Events,它含有data、error、end等事件。
咱们把上面代码改一下
// 监听pipe事件 fileWriteStream.on('pipe', source => { console.log(source); }); /* 经过pipe方式 */ fileReadStream.pipe(fileWriteStream);
pipe 可理解为水管,在可读流和可写流之间链接了水管,不须要再监听 data 事件,使用起来很方便 能达到一样的效果。
http 模块主要用于搭建 http 服务,处理用户请求信息等
const http = require('http'); // 使用发送http请求 const options = { protocol: 'http:', hostname: 'www.baidu.com', port: '80', method: 'GET', path: '/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg' }; let responseData = ''; const request = http.request(options, response => { console.log(response.statusCode); // 获取连接请求的状态码 response.setEncoding('utf8'); response.on('data', chunk => { responseData += chunk; }); response.on('end', () => { console.log(responseData); }); }); request.on('error', error => { console.log(error); }); request.end();
// 使用http建立服务器 const port = 3000; const host = '127.0.0.1'; const server = http.createServer(); server.on('request', (request, response) => { response.writeHead(200, { 'Content-Type': 'text/plain' }); response.end('Hello World\n'); }); server.listen(port, host, () => { console.log(`Server running at http://${host}:${port}/`); });
关于 Node 核心模块还有不少,好比 Buffer、crypto加密、global全局变量、net网络、os操做系统等等,只不过上面介绍的是使用频率很是高的模块。
后面文章会继续介绍,详情的api使用请参考官网