如何在Node.js中同步读取文件内容?

33

这就是我所拥有的:

#! /usr/bin/env node

var fs = require('fs'),
    files = fs.readdirSync(__dirname + '/files/'),

files.forEach(function(file) {
  fs.readFile(__dirname + '/files/' + file, 'utf8', function (error, data) {
    console.log(data)
  })
})

即使我使用 readdirSync,输出仍然是异步的:

alex@alex-K43U:~/node/readFiles$ node index.js 
foo 1

foo 3

foo 2

如何修改代码使输出变成同步的?

alex@alex-K43U:~/node/readFiles$ node index.js 
foo 1

foo 2

foo 3

我认为你的问题在于 forEach 不能保证顺序,你应该尝试使用一个简单的 for 循环。此外,如果你想同步读取文件,应该使用 readFileSync。 - DrakaSAN
3个回答

66

您需要使用readFileSync,因为您的方法仍然异步读取文件,这可能会导致根据每次读取的回调发生时间而打印内容无序。

var fs = require('fs'),
    files = fs.readdirSync(__dirname + '/files/');

files.forEach(function(file) {
  var contents = fs.readFileSync(__dirname + '/files/' + file, 'utf8');
  console.log(contents);
})

7
那是因为您异步读取了文件。尝试使用以下方法:
#! /usr/bin/env node

var fs = require('fs'),
    files = fs.readdirSync(__dirname + '/files/'),

files.forEach(function(file) {
  var data = fs.readFileSync(__dirname + '/files/' + file, 'utf8');
  console.log(data);
});

'fs.readFileSync()'的NodeJS文档


2

你看过readFileSync吗?我认为它可能会成为你的新朋友。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接