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

Con*_*erb 6 javascript node.js

我使用一个简单的Node.js从有效的jsonfile中提取信息(使用JSLint检查),但我使用的代码不返回预期的值:

        squadJSON = JSON.parse(fs.readFileSync('./squads/squad' + whichSquad + '.json'));    
Run Code Online (Sandbox Code Playgroud)

它返回:

{ type: 'Buffer',
Run Code Online (Sandbox Code Playgroud)

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

有什么理由为什么会这样?

Sid*_*ney 23

fs.readFileSync() 如果未指定编码,则返回Buffer.

https://nodejs.org/api/fs.html#fs_fs_readfilesync_path_options

那么,告诉fs.readFileSync()使用什么编码:

squadJSON = JSON.parse(fs.readFileSync('./squads/squad' + whichSquad + '.json', 'utf8')); 
Run Code Online (Sandbox Code Playgroud)

  • 是的!将值传递给第二个参数将起到这样的作用:`fs.readFileSync('/path/to/file.json', 'utf8')`。**太感谢了。 (2认同)

Pat*_*rts 5

Sidney回答了 “为什么”的问题,但最好使用“做什么” require(),它支持同步解析有效的JSON文件并将结果作为对象返回:

squadJSON = require('./squads/squad' + whichSquad + '.json');
Run Code Online (Sandbox Code Playgroud)

甚至更好,使用ES6 模板文字

squadJSON = require(`./squads/squad${whichSquad}.json`);
Run Code Online (Sandbox Code Playgroud)

使用中的一个显着区别require()是,它从中解析相对路径__dirname,这是当前模块的目录路径,而fs方法使用中process.cwd(),或者是“当前工作目录”,它是程序主模块所在的目录,来解析相对路径

希望下面的示例演示它们的相对路径分辨率如何不同:

使require(...)行为像JSON.parse(fs.readFileSync(..., 'utf8'))

const { resolve } = require('path');

function readFileSyncJson (path) {
  return require(resolve(process.cwd(), path));
}
Run Code Online (Sandbox Code Playgroud)

并使JSON.parse(fs.readFileSync(..., 'utf8'))行为像require(...)

const { resolve } = require('path');

function requireJson (path) {
  return JSON.parse(fs.readFileSync(resolve(__dirname, path), 'utf8'));
}
Run Code Online (Sandbox Code Playgroud)