JSON.parse(fs.readFileSync())返回一个缓冲区 - 数字字符串

时间:2018-02-16 00:25:29

标签: javascript node.js

我使用简单的Node.js从有效的json文件中提取信息(使用JSLint检查),但是我使用的代码并没有返回预期的值:

        squadJSON = JSON.parse(fs.readFileSync('./squads/squad' + whichSquad + '.json'));    

然后它返回:

{ type: 'Buffer',

数据:    [123,      10,      32,      32,      34,      97,      99,      ... 548个项目]}

为什么会发生这种情况的原因?

2 个答案:

答案 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'));
}