核心模块

Node.js 核心模块介绍(上)

fs 模块的介绍和 fs 中常用 API 整理,逐行阅读 readline 模块介绍

2018-10-06侠课岛    基础入门       

后端/Node.js/Node.js入门 19     0     3190

在实际的生产过程中,我们使用第三方模块(NPM 上的模块)的情况会更多,但不熟悉 Node 的核心模块就和只会框架不会原生 JavaSCript 一样是个假把式,对我们的学习提升都是没有意义的。毕竟包装再好的模块都是对基本的核心模块的封装。因此本章节将针对 Node 中最常用的核心模块以及关联的包进行介绍和讲解。其他的模块,大家可以利用 官网 等资料继续学习。

4.1 fs模块

fs 模块在之前的例子中大家已经接触过了,主要就是对于系统文件的操作。在实际的生产中如爬虫中的数据文件的保存、流文件的保存(图片、音频、视频等)、服务端的文件的上传、文件的管理、日志的输出等都用到该模块。

1. fs 中常用 API 整理

Node 为 fs 模块基本都提供了异步与同步两套 API,同步 API 都带有 Sync 后缀。在实际的生产过程中,我们要尽量避免使用同步 API,特别是在读取写入这类开销较大的操作时,防止造成程序的堵塞。

下面 API 我按照使用方法以及使用场景进行了分类。当然,为了方便演示,我们还要准备一份数据文件 line.txt,当中包含 5 行数据。

This is line one.
This is line two.
This is line three.
This is line four.
This is line five.

readFile & writeFile & appendFile

fs.readFile(path[, options], callback) 提供了一个简单地读取文件内容的方法。其中文件和回调函数是必填选项。 option 可以让我们定义编码。如果不定义编码,则会以 Buffer 的形式返回。同步方法为 fs.readFileSync(path[, options]) ;与之对应的写入 API 有 writeFile 和 appendFile。

一个文件读取的例子。

var fs = require('fs')

fs.readFile('./lines.txt', function (err, data) {
  if (err) {
    throw new Error(err)
  } else {
    console.log(data)
  }
})

此时由于我们没有添加编码,输出的结果是 Buffer 形式的数据流。

我们只要添加编码或者使用 toString() 方法就可以输出正常的内容了。

// 前面代码不变
fs.readFile('./lines.txt', 'utf-8', function (err, data) {
  // 中间逻辑不变
}

fs.writeFile(file, data[, options], callback) 和 fs.appendFile(file, data[, options], callback) 都是向文件写入数据的方法。同步方法为 fs.writeFileSync、fs.appendFileSync。其参数与 fs.readFile 方法相同。两者的不同之处可以参考下面表格。

API 名称 写入方式 写入时要求
fs.writeFile 完全覆盖 当文件不存在时,自动生成新的文件并写入内容;文件存在时,新内容会覆盖原来文件内容。
fs.appendFile 追加 当文件不存在时,自动生成新的文件并写入内容;文件存在时,在文件内容后追加新的内容。

小彩蛋——自己实现一个日志记录工具

在实际生产过程中,记录相关的日志在维护、排错方面非常有用,尤其是服务端应用。第三方的 log4js 也被用在很多模块中,如 express、koa等。在这里,我们应用上面学到的 fs 文件读写的 api 来自己实现一个日志记录的小工具。

首先,我们创建一个 logWriter.js 的文件,在其中创建主要的逻辑。在创建一个 log 目录用于存放我们生成的日志文件。

var chalk = require('chalk')
var fs = require('fs')

var dateTime = new Date()

// 时间格式化的小插件,其实可以使用 moment.js,这里就自己实现了
function getDateTime(dateTime) {
  var dateTime = dateTime ? new Date(dateTime) : new Date()
  var dateObj = {
    year: dateTime.getFullYear(),
    month: dateTime.getMonth() + 1,
    day: dateTime.getDay(),
    hour: dateTime.getHours(),
    minutes: dateTime.getMinutes(),
    seconds: dateTime.getSeconds()
  }
  return {
    dateObj: dateObj,
    dateString: `${dateObj.year}-${dateObj.month}-${dateObj.day} ${dateObj.hour}:${dateObj.minutes}:${dateObj.seconds}`
  }
}

// 接受三个参数,路径、类型、数据
function logWriter(path, opts, data) {
  var opts = opts || { type: 'normal' }
  var dateObj = getDateTime()
  fs.appendFile(path, `${dateObj.dateString}  Log-type: ${opts.type} \nlog content: ${data} \n`, function (err) {
    if (err) {
      throw new Error(err)
    } else {
      console.info(`${chalk.yellow('日志写入成功,请在' + path + '下查看。')}`)
    }
  })
}

module.exports = logWriter

本教程图文或视频等内容版权归侠课岛所有,任何机构、媒体、网站或个人未经本网协议授权不得转载、转贴或以其他方式复制发布或发表。

评价

19

本课评分:
  •     非常好
难易程度:
  •     适中的
|
教程
粉丝
主页

签到有礼

已签到2天,连续签到7天即可领取7天全站VIP

  • 1
    +2 金币
  • 2
    +3 金币
  • 3
    +5 金币
  • 6
    +7 金币
  • 5
    +6 金币
  • 4
    暖心福利
    自选分类VIP ×1天
  • 7
    惊喜大礼

    自选分类VIP ×3天 +20金币
  • 持续签到 +8 金币

金币可以用来做什么?