最近在完成一个从文件提取数据的繁杂任务时,发现node真的非常万能,竟然可以读/写文件,为此简单记录下其中遇到的一些使用心得。

读取文件

基本原理就是通过引入fs的模块,实现对文件的读取。node 已经内置了fs 模块,可以通过官网一窥究竟:

The fs module provides a lot of very useful functionality to access and interact with the file system.
There is no need to install it. Being part of the Node.js core, it can be used by simply requiring it:

const fs = require(‘fs’)

意思:fs模块提供了大量有用的函数来访问和与文件系统交互。我们没有必要来安装(fs),作为node.js的核心,通过简单的 require即可使用。

const fs = require('fs')

通过官网例子,我写了下面一个返回promise对象的读文件函数。

var fs = require("fs");

function getContent(name){
    return new Promise((resolve, reject) => {
        fs.readFile(`./components/${name}.txt`, function (err, data) {
            const dataStr = data.toString();
            resolve(dataStr);
            if (err) reject(err);
        });
    });
}

可见:

  • node 是支持模块化的,其通过require来引入模块,module.exports 来输出模块。参照CommonJs模块化规范。

写入文件

也是通过引入fs的模块,

const fs = require("fs");
	const str = JSON.stringify(data);
    fs.writeFile('data.json', str, function(err){
        if (err) {res.status(500).send('Server is error...')}
    })

注意:

  • 如何增量写入文件,而非上面的覆盖写入,可借助下面方法
fs.appendFile('data.json', str, function (err) {
    if (err) {
         reject(err);
     }
 });
  • 如果为了让写入的 json 文件格式规整,可以这样写:
//...
let str = JSON.stringify({ data }, null, "\t")
//...

阻塞io/非阻塞io

参照博文中所讲,主要是fs.readFileSyncfs.readFile两者的区别,其中:

  • readFileSync 是同步的,也就是阻塞io,后边的程序会等待 readFileSync 执行完再执行
  • readFile 是非同步的,那么通常我们会添加一个回调,方便读取 io 的结果

总结

原来 node 内置了http/fs等一些模块来方便我们进行开发,而 node 的模块化规范非常方便让我们去封装使用这些模块。


最终完成了一个基于node的爬虫demo:链接

如借助node中的http模块实现的http-server工具库,可以非常方便的实现一个静态文件服务,然后就可以非常方便地在局域网中分享文件哈哈。
比如在A主机安装了http-server,并启动http-server,这样会暴露一个<ip地址:端口>

npm install -g http-server
cd target
http-server

然后在同局域网的B主机上,访问<ip地址:端口>便可访问target目录下的文件,超级方便。


参考: