美文网首页我爱编程
node.js 使用详解

node.js 使用详解

作者: 天涯笑笑生 | 来源:发表于2018-05-28 17:28 被阅读0次

    一、简介

    • Node.js 就是运行在服务端的 JavaScript。
    • 基于Chrome JavaScript 运行时建立的一个平台
    • Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。
    • Node.js 是单进程单线程
    • Hello World
    //引入模块
    var http = require('http');
    
    //创建服务
    const server = http.createServer(
        (request, response) => {
    
            // 发送 HTTP 头部
            // HTTP 状态值: 200 : OK
            // 内容类型: text/plain
            response.writeHead(200, {'Content-Type': 'text/plain'});
    
            //发送响应数据
            response.end('Hello World\n');
        }
    );
    
    //监听
    server.listen(8000);
    

    注:代码中使用了箭头函数
    执行node app.js(Node环境还是必须安装的),浏览器http://127.0.0.1:8000/,返回结果则成功
    注:npm 是Node的包管理工具,一般不需要单独安装,随nodejs,npm -v查看版本,npm init -y初始化一个应用并自动创建package文件

    • REPL Node 自带交互式解释器

    二、基本使用

    2.1 回调函数

    • 异步编程依托于回调来实现
    • Node 所有 API 都支持回调函数
      如读文件时fs.readFileSync(path, options)阻塞方法,执行完毕才会执行下一句,但是使用fs.readFile(path, options, callback)非阻塞方法时,读文件操作开始后,就继续执行后面的代码,当读文件操作结束后再调用回调函数。

    2.2 事件循环

    • 虽然Node.js 是单线程,但 V8 引擎提供异步执行回调接口,所以Nodejs采用事件驱动模型,处理大量的并发任务
    // 引入 events 模块
    var events = require('events');
    // 创建 eventEmitter 对象
    var eventEmitter = new events.EventEmitter();
    
    // 绑定 connection 事件处理程序
    eventEmitter.on('connection', ()=> {
    
        console.log('连接成功。');
    
        // 触发 data_received 事件
        eventEmitter.emit('data_received');
    });
    
    // 使用匿名函数绑定 data_received 事件
    eventEmitter.on('data_received', ()=>console.log('数据接收成功。'));
    
    // 触发 connection 事件
    eventEmitter.emit('connection');
    
    console.log("程序执行完毕。");
    
    事件例子执行结果

    2.3 模块系统

    • 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。
    • exports 封装方法
      hello.js
      exports.world = ()=>console.log('Hello World !');
      使用require 引入
    var hello = require('./hello');
    hello.world();
    
    • module.exports 封装对象
      people.js
    function People() {
        var name;
        var age;
    
        this.setName = na=>name=na;
        this.setAge = ag=>age=ag;
        this.out = ()=>console.log('name:'+name+',age:'+age);
    }
    module.exports = People;
    
    var People = require('./people');
    
    people = new People();
    people.setName('LiHua');
    people.setAge(12);
    people.out();
    

    2.4 全局对象

    • Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性
    • __filename 表当前正在执行脚本的文件名
    • __dirname 表当前执行脚本所在的目录
    • setTimeout(cb, ms) 在指定时间后执行
    • clearTimeout(t) 停止通过 setTimeout() 创建的定时器
    • setInterval(cb, ms)间隔时间执行,可用clearTimeout(t)停止
    • console 控制台标准输出
    • process 描述当前进程状态

    2.5 常用工具

    • 由核心模块util提供
    • util.inherits(constructor, superConstructor) 是一个实现对象间原型继承 的函数
    • util.inspect(object,[showHidden],[depth],[colors])是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出
    • util.isArray(object) 是否是数组
    • util.isRegExp(object) 是否是正则表达式
    • util.isDate(object) 是否是日期对象
    • util.isError(object) 是否是错误对象

    2.6 文件系统

    • 虽然文件系统(fs 模块)模块中的有异步和同步两个版本,但建议使用异步
    打开文件

    fs.open(path, flags[, mode], callback)

    • path - 文件的路径
    • flags - 文件打开的行为
    • mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)
    • callback - 回调函数,带有两个参数如:callback(err, fd)


      flag参数取值
    获取文件信息

    fs.stat(path, callback)

    stats类方法
    写入文件

    fs.writeFile(file, data[, options], callback)

    • file - 文件名或文件描述符。
    • data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(流) 对象。
    • options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 'w'
    • callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。
    读取文件

    fs.read(fd, buffer, offset, length, position, callback)

    • fd - 通过 fs.open() 方法返回的文件描述符。
    • buffer - 数据写入的缓冲区。
    • offset - 缓冲区写入的写入偏移量。
    • length - 要从文件中读取的字节数。
    • position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
    • callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。
    关闭文件

    fs.close(fd, callback)

    • fd - 通过 fs.open() 方法返回的文件描述符
    • callback - 回调函数,没有参数
    其他操作

    fs.ftruncate(fd, len, callback) 截取文件
    fs.unlink(path, callback) 删除文件
    fs.mkdir(path[, mode], callback) 创建目录
    fs.readdir(path, callback) 读取目录
    fs.rmdir(path, callback) 删除目录

    2.7 工具模块

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

    三、Express 框架

    使用框架可以快速方便的搭建应用
    Express 官网

    四、多进程

    4.1 创建异步进程

    console.log("进程 " + process.argv[2] + " 执行。" );
    if (process.argv[2] == 1){
        var err = new Error('test error');
        throw err;
    }
    
    const {exec} = require('child_process');
    
    for (var i=0; i<3; i++){
        var newProcess = exec('node support.js '+i, (error, stdout, stderr)=>{
            if (error) {
                // console.log(error.stack);
                // console.log('Error code: '+error.code);
                // console.log('Signal received: '+error.signal);
            }
    
            console.log('stdout: ' + stdout);
            console.log('stderr: ' + stderr);
        });
    
        newProcess.on('exit', function (code) {
            console.log('子进程已退出,退出码 '+code);
        });
    }
    
    进程演示结果
    创建异步的函数

    4.2 创建同步进程

    创建同步的三个方法,会阻塞 Node.js 的事件循环,暂停任何额外代码的执行直到衍生的进程退出

    4.3 ChildProcess 类

    • ChildProcess 类的实例是 EventEmitter,代表衍生的子进程

    相关文章

      网友评论

        本文标题:node.js 使用详解

        本文链接:https://www.haomeiwen.com/subject/boxjrftx.html