NodeJS学习笔记

参考菜鸟教程

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

1OS 模块
提供基本的系统操作函数。版本,内存,时间等
2Path 模块
提供了处理和转换文件路径的工具。
3Net 模块
用于底层的网络通信。提供了服务端和客户端的的操作。
4DNS 模块
用于解析域名。
5Domain 模块
简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值