用node.js读写文件时,需要引入一个新的模块fs(file system文件系统)。文件系统的操作都有异步和同步的形式,案例使用异步方法,防止阻塞。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const fs = require('fs'); fs.readFile('aaa.txt', function(err, data) { if(err) { console.log('读取失败'); } else { console.log(data.toString()); } })
fs.writeFile('bbb.txt', 'hello world', function(err) { console.log(err); })
|
文件读取可以配合http
模块使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const http = require('http'); const fs = require('fs');
http.createServer(function(req, res) { let fileName = 'file/' + req.url;
fs.readFile(fileName, function(err, data) { if(err) { res.write('404'); } else { res.write(data); } res.end(); }) }).listen(8080);
|
2018/08/10 更新
fs
模块的readFile
方法是异步读取的,所以我们也可以结合ES6中提到的async函数来完成读取多个文件的操作。
- 首先添加两个文件来给我们一会儿读取,我在根目录下添加了一个
data
文件夹,里面放了很简单的两个文件1.txt
和2.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const fs = require("fs");
const readFile = function(fileName) { return new Promise((resolve, reject) => { fs.readFile(fileName, (err, data) => { if(err) return reject(err); resolve(data); }) }) }
const asyncReadFile = async function() { const f1 = await readFile('data/1.txt'); const f2 = await readFile('data/2.json'); console.log(f1.toString()); console.log(f2.toString()); }
asyncReadFile();
|
读取结果:
[2018/09/02 15:20 更新]
Node.js在进行异步操作时,传入的回调函数接受两个参数,一个是表示错误的err
,正常读取时,err
参数是null
,另一个参数是data
。如果发生了错误,err
就代表一个错误对象,data
就为undefined
。这是Node.js的标准回调函数。
当我们使用fs
模块读取文本信息时,data
为读取到的string
,如果我们读取的内容是图片,那么我们读取到的就是二进制文件,data
就返回一个buffer
对象。
我们也可以使用同步的方法读取文件。使用同步方法时,使用的方法会有一个Sync后缀,用来和异步方法区别开来。此外,同步的方法不接受回调函数,而是直接返回结果。
1 2 3
| const fs = require("fs"); let data = fs.readFileSync("./data/1.txt", "utf-8"); console.log(data);
|
如果同步读取文件发生错误,则需要使用try... catch
来捕获错误。
1 2 3 4 5 6
| try { let data = fs.readFileSync("./data/1.txt", 'utf-8'); console.log(data); } catch(err) { console.log(err); }
|
异步还是同步
关于实际运用中到底应该使用同步还是异步,由于JavaScript是单线程工作,绝大部分在服务器运行期要反复执行的代码都应该使用异步,否则同步执行期间,服务器将停止响应。
服务器启动时要读取的配置文件或者结束时需要写入到状态文件时,可以使用同步,因为这些代码在开始或结束时只执行一次。