[英]NodeJS readFileSync() returns an empty String
基本上,我使用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
哦,我好笨! 我发布的代码实际上没有任何错误。 有一件事我没有包括的是,我解雇fs.open
之前,我阅读文件,我不知道fs.open
湿巾一个文件,我只是想, 如果它不存在,将创建它。
很抱歉浪费您的时间。
首先,每次您在文件系统上读取或写入任何文件时,请始终使用绝对路径。 当您像在此处那样使用相对路径时,则它相对于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.parse()
但在这种情况下,请确保将其放入try
/ catch
,否则您的程序将在无效的JSON上崩溃。
另一件事是,由于您说这是其他地方需要的模块,因此请确保确实导出要在其他地方使用的值。 例如:
var file = read();
module.exports = file;
以及使用位置:
var data = require('records.js');
但是请注意,当您拥有JSON文件时,可以直接在其他模块中要求它,如下所示:
var data = require('../../servers.json');
不需要一个仅具有读取JSON并将其导出到其他模块的目的的模块。
正如Robert在评论中指出的那样,应该注意的是, require()
或readFileSync()
(或anything Sync
)仅应在事件循环的第一时间使用。 我假设这里文件在启动时被读取一次,结果被导出以供需要的模块使用。 如果在程序生存期内(例如,在请求控制器,事件处理程序,异步函数等中fs.readFile()
读取文件,则仅应使用fs.readFile()
或流函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.