美文网首页
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