• 12-《Node.js开发指南》-核心模块


    全局对象

    ``` Node.js中的全局对象是global 所有全局变量(除了global本身以外)都是global对象的属性 最根本的作用为全局变量的宿主 ```

    全局变量

    ``` //满足以下条件的是全局变量 a.在最外层定义的变量 b.全局对象的属性 c.隐式定义的变量(未定义直接赋值的变量) ```

    process

    ``` 用于描述当前Node.js进程状态的对象,提供了一个与操作系统的简单接口 ```

    process.argv

    ``` process.argv是命令行参数数组,第一个元素是node,第二个元素是脚本文件名,从第三个元素开始每个元素是一个运行参数; process.argv.forEach((val, index) => { console.log(`${index}: ${val}`); }) //命令行执行 node process-args.js one two=three four //命令行输出 0: /usr/local/bin/node 1: /Users/mjr/work/node/process-args.js 2: one 3: two=three 4: four ```

    process.stdout

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

    process.stdin

    ``` process.stdin是标准输入流,初始时它是被暂停的,要向从标准输入读取数据,你必须恢复流,并手动编写流的事件响应函数 process.stdin.resume(); process.stdin.on('data',function(data){ process.stdout.write('read from console:'+data.toString()); }) ```

    process.nextTick(callback)

    ``` //process.nextTick(callback)的功能是为事件循环设置一项任务,Node.js会在下次事件循环调响应时调用callback //Node.js适合I/O密集型的应用,而不是计算密集型的应用,因为一个Node.js进程只有一个线程,因此在任何时刻都 //只有一个事件在执行,如果这个事件占用大量的CPU时间,执行事件循环中的下一个事件就需要等待很久,因此Node.js //的一个编程原则就是尽量缩短每个事件的执行时间。process.nextTick(callback)提供了一个这样的工具,可以把复杂 //的工作拆散,变成一个个较小的事件; function doSomething(args,callback){ somethingComplicated(args); callback(); } doSomething(function onEnd(){ compute(); }) //假设compute()和somethingComplicated()是两个较为耗时的函数,以上的程序在调用doSomething()时会先执行 somethingComplicated(),然后立即调用回调函数,在onEnd()中又会执行compute() 改写 function doSomething(args,callback){ somethingComplicated(args); process.nextTick(callback); } doSomething(function onEnd(){ compute(); }) //改写后的程序会把上面耗时的操作拆分为两个事件,减少每个事件的执行时间,提高事件响应速度 ```

    常用工具util

    ``` util是一个Node.js核心模块,提供常用函数的集合,用于弥补核心javascript的功能过于精简的不足 ```

    util.inherits

    ``` //util.inherits(constructor,superconstructor)是一个实现对象间原型继承的函数。 //javascript的面向对象特性是基于原型的,与常见的基于类的不同。 //javascript没有提供对象继承的语言级别特性,而是通过原型复制来实现的。 var util = require('util'); function Base(){ this.name='base'; this.base = 1991; this.sayHello = function(){ console.log("hello"+this.name); }; } Base.prototype.showName = function(){ console.log(this.name); } function Sub(){ this.name = 'sub'; } util.inherits(Sub,Base);

    var objBase = new Base();
    objBase.showName();
    objBase.sayHello();
    console.log(objBase);

    var objSub = new Sub();
    objSub.showName();
    // objSub.sayHello();
    console.log(objSub);
    //Sub仅仅继承了Base在原型中定义的函数,而构造函数内部创造的base属性和sayHello函数都没有被Sub继承;

    <h3>util.inspect</h3>
    

    //util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换为字符串的方法,通常
    //用于调试和错误输出。它至少接收一个参数object,即要转换的对象
    //showHidden是一个可选参数,如果值为true,将会输出更多隐藏信息
    //depth表示最大递归的层数,如果对象很复杂,你可以指定层数以控制输出信息的多少,如果不指定depth,默认会递归2层
    //指定为null表示将不限递归层数完整遍历对象
    //如果color值为true,输出格式将会以ANSI颜色编码,通常用于在终端显示更漂亮的效果
    //**特别要指出的是,util.inspect 并不会简单的直接把对象转换为字符串,即使该对象定义了toString方法也不会调用
    var util = require('util');

    function Person(){
    this.name = 'bala';

    this.toString = function(){
        return this.name;
    }
    

    }

    var obj = new Person();

    console.log(util.inspect(obj));
    console.log(util.inspect(obj,true));

    <h2>事件驱动events</h2>
    

    //events 是Node.js最重要的模块。没有之一,原因是Node.js本身架构就是事件式的,而它提供了唯一的接口,所以堪称Node.js事件编程的基石。
    //events模块只提供了一个对象:events.EventEmitter
    //events.EventEmitter的核心就是事件发射与事件监听器功能的封装
    var events = require('events');
    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','柠檬不酸',1991);
    //listener1 柠檬不酸 1991
    //listener2 柠檬不酸 1991

    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,则移除指定事件的所有监听器

    <h3>error事件</h3>
    

    //EventEmitter定义了一个特殊的事件error,它包含了'错误'的语义,我们在遇到异常的时候通常会发射error事件,当error
    //发射时,EventEmitter规定如果没有响应的监听器,Node.js会把它当作异常,退出程序并打印调用栈
    //一般要为会发射error事件的对象设置监听器,避免遇到错误后整个程序崩溃
    var events = require('events');
    var emitter = new events.EventEmitter();
    emitter.emit('error');

    <h3>继承EventEmitter</h3>
    

    大多数时候我们不会直接使用EventEmitter,而是在对象中继承它,包括fs,net,http在内的,只要是支持事件响应的核心都是EventEmitter的子类
    为什么要这么做呢?
    1.具有某个实体功能的对象实现事件符合语义,事件的监听和发射应该是一个对象的方法
    2.javascript的对象机制是基于原型的,支持部分多重继承,继承EventEmitter不会打乱对象原有的继承关系

    <h2>文件系统访问</h2>
    <h3>文件系统fs</h3>
    

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

    <h3>fs.readFile</h3>
    

    fs.readFile(filename,[encoding],[callback(err,data)]
    //如果不指定编码,data将会是以Buffer形式表示的二进制数据

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

    <h3>fs.open</h3>
    

    fs.open(path,flags,[mode],[callback(err,id)]是POSIX open函数的封装
    path为文件的路径
    flags可以是:
    r:以读取模式打开文件
    r+:以读写模式打开文件
    w: 以写入模式打开文件,如果文件不存在则创建
    w+: 以读写模式打开文件,如果文件不存在则创建
    a: 以追加模式打开文件,如果文件不存在则创建
    a+: 以读取追加模式打开文件,如果文件不存在则创建
    mode参数用于创建文件时给文件指定权限,默认是0666.回调函数将会传递一个文件描述符fd

    <h3>fs.read</h3>
    

    fs.read(fd,buffer,offset,length,position,[callback(err,bytesRead,buffer)])是POSIX read函数的封装,相比fs.readFile提供了更底层的接口
    功能:是从指定的文件描述符fd中读取数据并写入buffer指向的缓冲区对象
    offset: 是buffer的写入偏移量
    length: 是要从文件中读取的字节数
    position: 是文件读取的起始位置,如果position的值为null,则会从当前文件指针的位置读取
    回调函数:传递byteRead和buffer,分别表示读取的字节数和缓冲区对象

    var fs = require('fs'); // 引入fs模块

    // 打开文件
    fs.open('./content.txt', 'r', function(err, fd) {
    if (err) {
    throw err;
    }
    console.log('open file success.');
    var buffer = new Buffer(255);
    // 读取文件
    fs.read(fd, buffer, 0, 10, 0, function(err, bytesRead, buffer) {
    if (err) {
    throw err;
    }
    // 打印出buffer中存入的数据
    console.log(bytesRead, buffer.slice(0, bytesRead).toString());

    });
    

    });
    //除非必要,一般不用

    <h2>HTTP服务器与客户端</h2>
  • 相关阅读:
    j2ee四大作用域pagecontext,request,session,ServletContext(转)
    ActionErrors 使用说明 struts1 validate 处理流程 详细教程(转)
    Structs1 -配置例子(转)
    2016年3月19日 培训复习
    抽象类中的抽象方法也是默认public的么(类似于interface)?
    积分商城1期设计
    积分商城1期设计
    android使用模拟机测试时,若要联网IP地址该怎么写?
    JS和CSS压缩部署,提高访问效率
    JS和CSS压缩部署,提高访问效率
  • 原文地址:https://www.cnblogs.com/foreverLuckyStar/p/12076899.html
Copyright © 2020-2023  润新知