我使用简单的Node.js从有效的json文件中提取信息(使用JSLint检查),但是我使用的代码并没有返回预期的值:
squadJSON = JSON.parse(fs.readFileSync('./squads/squad' + whichSquad + '.json'));
然后它返回:
{ type: 'Buffer',
数据: [123, 10, 32, 32, 34, 97, 99, ... 548个项目]}
为什么会发生这种情况的原因?
答案 0 :(得分:13)
fs.readFileSync()
会返回一个缓冲区。
https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options
因此,请告诉fs.readFileSync()
要使用的编码:
squadJSON = JSON.parse(fs.readFileSync('./squads/squad' + whichSquad + '.json', 'utf8'));
答案 1 :(得分:4)
“为什么”一直是answered by Sidney,但更好的“做什么”就是使用require()
,它同步支持parsing valid JSON files并将结果作为对象返回:< / p>
squadJSON = require('./squads/squad' + whichSquad + '.json');
甚至更好,使用ES6 template literal:
squadJSON = require(`./squads/squad${whichSquad}.json`);
使用require()
的一个显着区别是,它解析了__dirname
的相对路径,fs
methods resolve relative paths是当前模块的目录路径,而process.cwd()
使用{{3}}或“当前工作目录“,这是程序主模块所在的目录。
希望以下示例说明它们的相对路径分辨率如何不同:
要使require(...)
表现得像JSON.parse(fs.readFileSync(..., 'utf8'))
:
const { resolve } = require('path');
function readFileSyncJson (path) {
return require(resolve(process.cwd(), path));
}
让JSON.parse(fs.readFileSync(..., 'utf8'))
的行为与require(...)
相似:
const { resolve } = require('path');
function requireJson (path) {
return JSON.parse(fs.readFileSync(resolve(__dirname, path), 'utf8'));
}