美文网首页
Node.js入门(五) : Nodejs模块API介绍

Node.js入门(五) : Nodejs模块API介绍

作者: Tenloy | 来源:发表于2018-07-18 16:18 被阅读117次

    本文主要介绍一下几个模块的API:
    文件操作fs path、Buffer缓冲区、Stream文件流、promise与then、querystring及字符串扩展

    Node - API模块的种类

    在Node.js中,模块分为两类:

    第一类,核心模块(原生模块),node自带,用名称直接可以加载:require('fs')
    - 核心模块
        文件操作相关模块:
          fs(file system)   文件操作
          path 路径字符串操作
          readline  按行读取文本文件
          Buffer    缓冲区
          Stream  流
    
      + http:网络模块
      + querystring
      + url
      ...
    第二类,文件模块,用路径加载,有一种特殊的文件模块-包,可以用名字。require('../xx.js')
    

    https://nodejs.org/dist/latest-v6.x/docs/api/ nodejs API文档

    一、fs模块

    fs模块是node非常重要的模块,能体现出node的优势

    • fs模块对文件的几乎所有操作都有同步和异步两种形式
      例如:readFile()和readFileSync()
    • 分别是同步文件系统调用、异步文件系统调用
    • 同步与异步文件系统调用的区别
      • 异步调用需要回调函数作为额外的参数,通常包含一个错误作为回调函数的第一个参数
      • 异步调用通过判断第一个err对象处理异常,同步必须使用try/catch
      • 同步调用立即执行,会阻塞当前线程
      • 异步调用会进入事件队列,不阻塞后续代码的继续执行,实际的调用直到它被事件循环线程提取出才会执行
        文件写入
            fs.writeFile(file,data[,option],callback(err))
            fs.writeFileSync(file,data,[,option])
        文件追加内容
            fs.appendFile(file,data[,options],callback(err))
            fs.appendFileSync(file,data[,options])
        文件读取内容
            fs.readFile(file[,options],callback(err,data))
            fs.readFileSync(file,[,option])
        验证路径是否存在
            fs.access(path,callback(access))
            fs.accessSync(path) // => 返回布尔类型
        获取文件信息
            fs.stat(path,callback(err,stats))
            fs.statSync(path) // => 返回一个fs.Stats实例
                  stats.isFile() 如果是文件,返回true
                          isDirectory() 如果是目录,返回true
                          isSymbolicLink:用于判断被查看的文件是否为一个符号链接文件,如果是的话则返回true,否则,返回false。该方法仅在lstat方法的回调函数中有效;
                          size 文件字节数
                          atime 文件上次访问时间
                          mtime 文件最后修改时间
                          ctime 文件创建时间
        删除文件
            fs.unlink(path,callback(err))
            fs.unlinkSync(path)
        重命名文件或目录
            fs.rename(oldPath,newPath,callback)
            fs.renameSync(oldPath,newPath)
        移动文件
            fs.rename(oldPath)
        创建一个目录
            fs.mkdir(path[,model],callback)
            fs.mkdirSync(path[,model])
        删除一个空目录
            fs.rmdir(path,callback)
            fs.rmdirSync(path)
        读取一个目录
            fs.readdir(path,callback(err,files))
            fs.readdirSync(path) // => 返回files
        监视文件变化:
            fs.watchFile(filename[, options], listener(curr,prev))
                options:{persistent,interval}
            fs.watch(filename[,options][,listener])
    

    重点说明一下这两个常用API:

    fs.readFile(file, [options], callback) 读文件
    //file 读文件的路径
    //options 用[]包裹的可选参数,object {"encoding":"uft8","flag":"r"}  string 'utf8'
    //callback function  callback函数里面有两个参数 
    //err表示错误对象,如果readFile发生错误了,在callback函数里面会回返回err,err对象里面存着错误信息
    //如何读文件成功,err为null
    //data就是读文件,读出来的内容。
    
    - fs.access(path,[mode], callback) 用来判断文件是否存在
    //path 判断路径是否正确(也可以判断文件)'./pic'
    //mode一般不用,默认就可以了,用的话是用来判断文件是否可读可写可执行
    //callback 只有一个参数err,错,文件有问题
    

    其它

    二、Path模块

    path:处理路径相关字符串
        basename(p[,ext])     注意第二个参数用法  获取文件名
        dirname(p)      获取文件目录
        extname(p)      获取文件扩展名
        format(pathObject) 和 parse(pathString)
        isAbsolute(path)      判断是否是绝对路径
        join([path1][,path2][,...]) 拼接路径字符串
        normalize(p)    将非标准路径转换为标准路径
        sep 获取操作系统的文件路径分隔符
    
    path.join("/a","/b",,,,,) 将多个参数连成一个Path
    

    三、buffer(缓冲区)模块

    • JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
    • 但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区,缓冲区就是内存中操作数据的容器,只是数据容器而已
    • 在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
    • 通过缓冲区可以很方便的操作二进制数据,而在大文件操作时必须要有缓冲区

    创建Buffer

    在v6.0之前创建Buffer对象直接使用new Buffer()构造函数来创建对象实例,但是Buffer对内存的权限操作相比很大,可以直接捕获一些敏感信息,所以在v6.0以后,官方文档里面建议使用 Buffer.from() 接口去创建Buffer对象。

    Buffer 是一个像 Array 的对象,它的元素为16进制的两位数(0-255的值),主要用于操作字节,
    Buffer 是一个全局对象,使用的时候不需要 require
    
    const buf = Buffer.from('runoob', 'ascii');
    // 输出 72756e6f6f62
    console.log(buf.toString('hex'));
    // 输出 cnVub29i
    console.log(buf.toString('base64'));
    

    Buffer的一些属性和方法

    - buf[index] 通过下标访问 buffer 的某个字节的数据
    - buf.indexOf(value,[byteOffset],[encoding]) 查找某个字符在 buffer 内存中的字节下标
    - buf.includes(value,[byteOffset],[encoding])
    - buf.length                                                            // 长度
    - buf.toString([encoding],[start], [end])                  // 从Node缓冲区读取数据
    - buf.write(string,[offset],[length],[encoding])        // 写入缓冲区
    - buf.toJSON()                                                      // 将 Node Buffer 转换为 JSON 对象
    Buffer.concat(list[, totalLength])                           // Node 缓冲区合并
    - buf.compare(otherBuffer);                                 // 缓存区比较
    - buf.copy(targetBuffer[, targetStart[, sourceStart[, sourceEnd]]])    // 拷贝
    - buf.slice([start,[end]])                                         // 剪切
    

    四. Stream文件流

    Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream对象,还有stdout(标准输出)。

    fs.readFile()和fs.writeFile()问题?
        对大文件的处理,例如下载
    通过文件流的形式传输大文件
        const rs = fs.createReadStream(path1);
        const ws = fs.createWriteStream(path1);
        rs.pipe(ws);
    如何去控制流。
        我们可以通过监听stream对象里面的事件,去控制读写流。
    

    五、异步链式中的promise与then

    then传递的是promise对象,了解即可,then不要求会用,会使用以前的嵌套模式即可
    then()方法的两个function参数,对应promise函数的两个参数: resolve,reject成功与失败
    
    //代码演示
    var rf = function(){
        return new Promise(function(resolve, reject){
          fs.readFile('./00.js', 'utf8', (err,data) => {
            if(err){
                reject(err);
            }else {
                resolve(data);
            }
          })
        })
    }
    
    rf().then(funciton(data){},function(err){})
    
    

    六、querystring以及字符串的一些扩展

    querystring从字面上的意思就是查询字符串,一般是对http请求所带的数据进行解析。querystring模块只提供4个方法,互相对应的。

      const querystring = require("querystring");
    1. parse这个方法是将一个字符串反序列化为一个对象
        querystring.parse(str,separator,eq,options)  
    2. stringify这个方法是将一个对象序列化成一个字符串,与querystring.parse相对
        querystring.stringify(obj,separator,eq,options)  
    3. escape可使传入的字符串进行URL编码
        querystring.escape(str)
    4. unescape对字符串进行解码
        querystring.unescape(str)
    

    字符串扩展

    includes(str) 
    startsWith(str) 
    endsWith(str) 
    repeat(num) 
    `${变量名}`
        模板字符串,使用反引号 (` `) 来代替普通字符串中的用双引号和单引号。模板字符串可以包含特定语法(${expression})的占位符
    

    相关文章

      网友评论

          本文标题:Node.js入门(五) : Nodejs模块API介绍

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