参考菜鸟教程
let
关键词声明拥有块作用域的变量,在块 {} 内声明的变量无法从块外访问
var 关键字声明没有作用域,在块 {} 内声明的变量可以从块之外进行访问。
const: 无论在全局作用域下还是局部作用域下,都可以声明并赋值一个常量,但是常量是不可被再次定义或赋值的,即便是在全局作用域下声明赋值一个常量,在局部作用域下修改其值,虽然代码提示不会报错,但是也是不可行的。
回调函数
1.通过require导入模块
2.npm init生成项目的package.json配置文件
var http = require('http');
var express=require('express')
var fs = require('fs')
var readFileSync = fs.readFileSync('./input.txt');
console.log(readFileSync.toString())
console.log("程序执行结束!1");
fs.readFile('./input.txt', function(err,data) {if (err) {console.error(err)} if (data)console.log(data.toString());})
console.log("程序执行结束!2");
事件驱动
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。webserver 一直接受请求而不等待任何读写操作。(这也称之为非阻塞式IO或者事件驱动IO)
var events = require('events');
var eventEmitter = new events.EventEmitter();
//创建了一个新的事件
//events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件触发与事件监听器功能的封装。
var connectedHandler=function connected(){eventEmitter.emit('data_received');}
eventEmitter.on('connection',connectedHandler)
//当事件触发时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。
eventEmitter.on('data_received',function (){console.log('数据接受成功')})
setTimeout(function () {
eventEmitter.emit('connection');
},2000)
console.log('定时器设置完毕');
on 函数用于绑定事件函数,emit 属性用于触发一个事件。
事件驱动框架EventEmitter的API
EventEmitter中事件的增删改查事件和监听者的相关api
var event=require('events')
var eventEmitter =new event.EventEmitter();
// 监听器 #1
var listener1 = function listener1() {
console.log('监听器 listener1 执行。');
}
// 监听器 #2
var listener2 = function listener2() {
console.log('监听器 listener2 执行。');
}
//添加连接
eventEmitter.addListener("connection",listener1);
eventEmitter.addListener("connection",listener2);
console.log("connection现有的的监听者:"+eventEmitter.listenerCount('connection'));
console.log(eventEmitter.listeners("connection"));
eventEmitter.emit("connection");
console.log("触发connection");
eventEmitter.removeListener("connection",listener1,function () {
console.log("connection 删除了listener1成功")
});
console.log("connection现有的的监听者:"+eventEmitter.listenerCount('connection'));
console.log(eventEmitter.listeners("connection"));
eventEmitter.emit("connection");
console.log("end")
缓冲区
//定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
var buf = Buffer.from("你好!",'utf8');
console.log(buf.toString('base64'));
var alloc = Buffer.alloc(100);
var write = alloc.write('www.baidu.com');
console.log("写入:"+write)
console.log(alloc.toString('ascii'))
var concat = Buffer.concat([alloc,buf]);
console.log(buf.toJSON('utf8'));
console.log(alloc.compare(buf))
var buf2 = Buffer.from("你好!",'utf8');
console.log(buf2.compare(buf))
console.log('buff length'+concat.length)
Stream流
1.输入输出流
2.管道流
3.链式流处理
//Stream 有四种流类型: Readable - 可读操作
// Writable - 可写操作
// Duplex - 可读可写操作
// Transform - 操作被写入数据,然后读出结果。
//Stream 对象都是 EventEmitter 的实例。
// data - 当有数据可读时触发。
// end - 没有更多的数据可读时触发
// error - 在接收和写入过程中发生错误时触发
// finish - 所有数据已被写入到底层系统时触发
var fs = require('fs');
var readStream = fs.createReadStream('./input.txt');
var data='';
readStream.on('data', function(chunk){data+=chunk;console.log('读取....')})
//当监听到数据可读的时候直接拼接到data后
readStream.on('end', function(){console.log(data)})
readStream.on('error', function(err){console.error(err)})
//管道流,用pipe(管子将输入输出连接起来)
//一个输入流通过pipe,将数据写入到输出流中
fs.createReadStream('./package-lock.json').pipe(fs.createWriteStream('./pack-demo.json'));
//链式流,通过链式编程,将流操作用pipe结合起来
var zlib = require('zlib');
fs.createReadStream('./package-lock.json').pipe(zlib.createGzip()).pipe(fs.createWriteStream('./pack-demo.gz'));
NodeJS的模块系统及加载顺序
model.js文件内容
var hello = require('./hello');
//引入当前目录的hello.js文件,js是默认后缀
//Node.js提供了exports和 require 两个对象,其中exports是模块公开的接口
//require 用于从外部获取一个模块的接口,即所获取模块的 exports 对象。
hello.world();
//hello.js 通过 exports 对象把 world 作为模块的访问接口,在 main.js 中通过 require('./hello') 加载这个模块,然后就可以直接访 问 hello.js 中 exports 对象的成员函数了。
//把一个对象封装到模块中
var Hello = require('./hello');
hello = new Hello();
hello.setName('BYVoid');
hello.sayHello();
被导入模块
exports.world = function() {
console.log('Hello World');
}
function Hello() {
var name;
this.setName = function(thyName) {
name = thyName;
};
this.sayHello = function() {
console.log('Hello ' + name);
};
};
module.exports = Hello;
//exports 和 module.exports 的使用
//如果要对外暴露属性或方法,就用 exports 就行,
// 要暴露对象(类似class,包含了很多属性和方法),就用 module.exports。
NodeJS全局对象
在 Node.js 我们可以直接访问到 global 的属性,而不需要在应用中包含它。
__filename
表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,如果在模块中,返回的值是模块文件的路径。
__dirname
表示当前执行脚本所在的目录。
setTimeout(cb, ms)
在指定的毫秒(ms)数后执行指定函数(cb)。setTimeout() 只执行一次指定函数。
clearTimeout(t)
clearTimeout用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的定时器。
setInterval(cb, ms)
在指定的毫秒(ms)数后执行指定函数(cb)。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
process对象
用于当前Nodejs进程操作的API,详情参考菜鸟Nodejs中的全局对象
util.inspect函数,好用
是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出。它至少接受一个参数 object,即要转换的对象。
NodeJS操作文件系统(fs)
fs库集成了用户对文件系统进行增删改查的相关API
1 | OS 模块 提供基本的系统操作函数。版本,内存,时间等 |
2 | Path 模块 提供了处理和转换文件路径的工具。 |
3 | Net 模块 用于底层的网络通信。提供了服务端和客户端的的操作。 |
4 | DNS 模块 用于解析域名。 |
5 | Domain 模块 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的。 |