NodeJS readFileSync()返回一个空String

时间:2017-05-09 18:31:40

标签: javascript node.js fs

基本上,我使用Node的FS模块来读写JSON文件。写它完全正常但由于某种原因读它会返回一个空字符串。

此文件名为 records.js

const dir = 'servers.json';

function write(content) {
    fs.writeFileSync(dir, content);
}

function read() {
    return fs.readFileSync(dir, 'utf-8');
}

var file = read(); //This is always empty

有一件事:该脚本是一个单独的模块,位于我的主index.js的子文件夹中。但是,如果这是原因,写文件也不会有效。

目录

servers.json
src/
    index.js
    util/
        records.js

2 个答案:

答案 0 :(得分:1)

哦,我太笨了! 我发布的代码实际上没有任何错误。我没有提到的一件事是我在阅读文件之前解雇fs.open并且我不知道fs.open擦除文件,我只是认为它会创建它如果它不存在。

抱歉浪费你的时间。

答案 1 :(得分:0)

首先,每次在文件系统上读取或写入任何文件时,始终使用绝对路径。当你像在这里一样使用相对路径时,它与process.cwd()相关,可能与你的想法不同。

在您的情况下,从records.js访问时,目录结构中文件的绝对路径为:

let path = path.join(__dirname, '..', '..', 'servers.json');

或:

let path = path.join(__dirname, '../../servers.json');

而不只是:

var file = read();

你实际上需要运行:

write('something');

然后:

var file = read();

此外,由于您要读取的文件似乎是JSON,因此您可能希望将其读作JSON。你可以用require:

来做
let object = require('../../file.json');

或者您可以阅读它,然后使用JSON.parse()将其解析为JSON - 但在这种情况下,请确保将其放在try / catch内,否则您的程序将崩溃无效的JSON。

另一件事是,既然你说它是其他地方所需的模块,请确保实际导出你想要在其他地方使用的值。例如:

var file = read();
module.exports = file;

以及您使用它的地方:

var data = require('records.js');

但是请注意,当你有一个JSON文件时,你可以直接在其他模块中要求它:

var data = require('../../servers.json');

不需要一个只有一个目的是读取JSON并将其导出到其他模块的模块。

更新

正如Robert在评论中指出的那样,应该注意require()readFileSync()(或anythingSync)只应在事件循环的第一个刻度上使用。我假设这里文件在启动时被读取一次,结果被导出以供需要的模块使用。如果在程序的生命周期内读取文件,例如在请求控制器,事件处理程序,异步函数等中,只应使用fs.readFile()或流函数。