基本上,我使用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
答案 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()
或流函数。