Node.js(4)— 全局变量、事件驱动events、文件系统fs

目录

一、全局变量

  1.全局对象与全局变量

  2.process

        (1)process.argv

        (2)process.stdout

        (3)process.stdin

        (4)process.nextTick(callback)

  3.console

        (1) console.log()

        (2) console.error()

        (3) console.trace()

二、事件驱动events

  1.事件发射器

  2.error事件

  3.继承EventEmitter

三、文件系统fs

  1.fs.readFile

  2.fs.readFileSync 

  3.fs.open

  4.fs.read 


       核心模块是Node.js的心脏,它由一些精简而高效的库组成,为Node.js提供了基本的API。

一、全局变量

        javaScript中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量.

        在浏览器JavaScript中,通常window是全局对象,而Node.js中的全局对象是global,所有全局变量(除了global本身以外)都是global对象的属性。我们在Node.js中能够直接访问到对象通常都是global的属性,如console、process等

  1.全局对象与全局变量

        global最根本的作用是作为全局变量的宿主。

        按照ECMAScript的定义,满足以下条件的变量是全局变量:

  • 在最外层定义的变量;
  • 全局对象的属性;
  • 隐式定义的变量(未定义直接赋值的变量)。

        当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。

  2.process

         process是一个全局变量,即global对象的属性。它用于描述当前Node.js进程状态的对象,提供了一个与操作系统的简单接口。

        process对象常用成员方法:

        (1)process.argv

        process.argv是命令行参数数组,第一个元素是node,第二个元素是脚本文件名,从第三个元素开始每个元素是一个运行参数。在控制台打印出process.argv :

//argv.js
console.log(process.argv)

运行结果如下: 

        控制台返回的数组当中第一个元素是 process.exePath(Node.js 进程的可执行文件的绝对路径名) 第二个元素将是正在执行的 JavaScript 文件的路径。 其余元素将是任何其他命令行参数。

        (2)process.stdout

        process.stdout是标准输出流,通常我们使用的console.log()向标准输出打印字符,而process.stdout.write()函数提供了更底层的接口。 

        (3)process.stdin

        process.stdin是标准输入流,初始时它是被暂停的,要想从标准输入读取数据,必须恢复流,并手动编写流的事件响应函数。

process.stdin.resume()
process.stdin.on(data,function(data){
    process.stdout.write('read from console ' + data.toString())
})

        (4)process.nextTick(callback)

        process.nextTick(callback)的功能是为事件循环设置一项任务,Node.js会在下次事件循环调响应时调用callback。

        Node.js适合I/O密集型的应用,而不是计算密集型的应用,因为一个Node.js进程只有一个线程,因此在任何时刻都只有一个事件在执行。如果这个事件占用大量的CPU时间,执行事件循环中的下一个事件就需要等待很久,因此Node.js的一个编程原则就是尽量缩短每个事件的执行时间。process.nextTick()提供了一个这样的工具,可以把复杂的工作拆散,变成一个个较小的事件。 

console.log('start');
process.nextTick(() => {
  console.log('nextTick callback');
});
console.log('scheduled');

        运行结果为:

 process.nextTick() 将 callback 添加到"下一个滴答队列"。 在 JavaScript 堆栈上的当前操作运行完成之后,且在允许事件循环继续之前,此队列将被完全排空。           

  3.console

         console用于提供控制台标准输出,它是由Internet Explorer的JScript引擎提供的调试工具,后来逐渐成为浏览器的事实标准。Node.js沿用了这个标准,提供与习惯行为一致的console对象,用于向标准输出流(stdout)或标准错误流(stderr)输出字符。

        (1) console.log()

        向标准输出流打印字符并以换行符结束。console.log接受若干个参数,如果只有一个参数,则输出这个参数的字符串形式。如果有多个参数,则以类似于C语言printf()命令的格式输出。第一个参数是一个字符串,如果没有参数,只打印一个换行。

console.log('hello world');
console.log('hello%dolleh');
console.log('hello%dolleh',2021);

        运行结果如下:

        (2) console.error()

        与console.log()用法相同,只是向标准错误流输出。

        (3) console.trace()

        向标准错误流输出当前的调用栈。

console.trace();

        运行结果如下:

二、事件驱动events

         events是Node.js最重要的模块,没有“之一”,原因是Node.js本身架构就是事件式的,而它提供了唯一的接口,所以堪称Node.js事件编程的基石。

  1.事件发射器

        events模块只提供了一个对象:events.EventEmitter

        EventEmitter的核心就是事件发射与事件监听器功能的封装

        EventEmitter的每个事件由一个事件名和若干个参数组成,事件名是一个字符串,通常表达一定的语义。对于每个事件,EventEmitter支持若干个事件监听器。当事件发射时,注册到这个事件的事件监听器被依次调用,事件参数作为回调函数参数传递。 

var events = require('events');
const { fsync } = require('fs');
var emitter = new events.EventEmitter()
emitter.on('someEvent',function(arg1,arg2){
    console.log('listener1',arg1,arg2);
})
emitter.on('someEvent',function(arg1,arg2){
    console.log('listener2',arg1,arg2);
})
emitter.emit('someEvent','abc',2021)

        运行结果如下:

        在这个例子中,emitter为事件someEvent先后注册了两个事件监听器,然后发射了someEvent事件。运行结果中可以看到两个事件监听器回调函数被先后调用。 

    EventEmitter常用API如下:

  • EventEmitter.on(event, listener)为指定事件注册一个监听器,接受一个字符串event和一个回调函数listener。
  • EventEmitter.emit(event, [arg1],[arg2],[...])发射event事件,传递若干可选参数到事件监听器的参数表。
  • EventEmitter.once(event, listener)为指定事件注册一个单次监听器,即监听器最多只会触发一次,触发后立刻解除该监听器。
  • EventEmitter.removeListener(event, listener)移除指定事件的某个监听器,listener必须是该事件已经注册过的监听器。
  • EventEmitter.removeAllListeners([event])移除所有事件的所有监听器,如果指定event,则移除指定事件的所有监听器。

  2.error事件

        EventEmitter定义了一个特殊的事件error,它包含了“错误”的语义,我们在遇到异常的时候通常会发射error事件。

        当error被发射时,EventEmitter规定如果没有响应的监听器,Node.js会把它当作异常,退出程序并打印调用栈。我们一般要为会发射error事件的对象设置监听器,避免遇到错误后整个程序崩溃。

var events = require('events')
var emitter = new events.EventEmitter()
emitter.emit('error')

        运行结果如下 :

  3.继承EventEmitter

        大多数时候我们不会直接使用EventEmitter,而是在对象中继承它。包括fs、net、http在内的,只要是支持事件响应的核心模块都是EventEmitter的子类。

1.具有某个实体功能的对象实现事件符合语义,事件的监听和发射应该是一个对象的方法。2.JavaScript的对象机制是基于原型的,支持部分多重继承,继承EventEmitter不会打乱对象原有的继承关系。

三、文件系统fs

        fs模块是文件操作的封装,它提供了文件的读取、写入、更名、删除、遍历目录、链接等POSIX文件系统操作。与其他模块不同的是,fs模块中所有的操作都提供了异步的和同步的两个版本。

  1.fs.readFile

        fs.readFile(filename,[encoding],[callback(err,data)])是最简单的读取文件的函数。

        它接受一个必选参数filename,表示要读取的文件名

        第二个参数encoding是可选的,表示文件的字符编码。

        callback是回调函数,用于接收文件的内容。如果不指定encoding,则callback就是第二个参数。回调函数提供两个参数err和data,err表示有没有错误发生,data是文件内容。如果指定了encoding,data是一个解析后的字符串,否则data将会是以Buffer形式表示的二进制数据。

var fs = require('fs')
//从content当中读取数据但不指定编码,content内容为“Hello World”
fs.readFile('./content.txt',function(err,data){
    if(err){
        console.log(err);
    }else{
        console.log(data);
    }
})

        运行结果如下:

 

        程序以二进制的模式读取了文件的内容,data的值是Buffer对象。 

给fs.readFile的encoding指定编码:

var fs = require('fs')
fs.readFile('./content.txt','utf-8',function(err,data){
    if(err){
        console.log(err);
    }else{
        console.log(data);
    }
})

        运行结果如下:

 

        当读取文件出现错误时,err将会是Error对象。如果content.txt不存在,运行前面的代码则会出现以下结果:

 

        Node.js的异步编程接口习惯是以函数的最后一个参数为回调函数,通常一个函数只有一个回调函数。回调函数是实际参数中第一个是err,其余的参数是其他返回的内容。如果没有发生错误,err的值会是null或undefined。如果有错误发生,err通常是Error对象的实例。  

  2.fs.readFileSync 

        fs.readFileSync(filename, [encoding])是fs.readFile同步的版本。它接受的参数和fs.readFile相同,而读取到的文件内容会以函数返回值的形式返回。如果有错误发生,fs将会抛出异常,需要使用try和catch捕捉并处理异常。与同步I/O函数不同,Node.js中异步函数大多没有返回值。

  3.fs.open

        fs.open(path, flags, [mode],[callback(err, fd)])是POSIXopen函数的封装。它接受两个必选参数,path为文件的路径,flags可以是以下值。

  • r:以读取模式打开文件。
  • r+:以读写模式打开文件。
  • w:以写入模式打开文件,如果文件不存在则创建。
  • w+:以读写模式打开文件,如果文件不存在则创建。
  • a:以追加模式打开文件,如果文件不存在则创建。
  • a+:以读取追加模式打开文件,如果文件不存在则创建。

  4.fs.read 

        fs.read(fd, buffer, offset, length, position, [callback(err, bytesRead,buffer)])是POSIXread函数的封装,相比fs.readFile提供了更底层的接口。

        fs.read的功能是从指定的文件描述符fd中读取数据并写入buffer指向的缓冲区对象。

        offset是buffer的写入偏移量。

        length是要从文件中读取的字节数。

        position是文件读取的起始位置,如果position的值为null,则会从当前文件指针的位置读取。回调函数传递bytesRead和buffer,分别表示读取的字节数和缓冲区对象。

猜你喜欢

转载自blog.csdn.net/m0_59897687/article/details/121017792