【问题标题】:JSON.parse(fs.readFileSync()) returning a buffer - string of numbersJSON.parse(fs.readFileSync()) 返回一个缓冲区 - 数字字符串
【发布时间】:2018-07-26 20:52:04
【问题描述】:

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

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

然后它返回:

{ type: 'Buffer', data: 
[ 123,
 10,
 32,
 32,
 34,
 97,
 99,
 ... 548 more items ] }

为什么会发生这种情况?

【问题讨论】:

  • 期望值是多少?
  • 没有。 JSON.parse 永远不会返回缓冲区。

标签: javascript node.js


【解决方案1】:

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')); 

【讨论】:

  • 是的!将值传递给第二个参数将起到这样的作用:fs.readFileSync('/path/to/file.json', 'utf8')非常感谢
【解决方案2】:

“为什么”一直是answered by Sidney,但更好的“做什么”是使用require(),它支持同步parsing valid JSON files并将结果作为对象返回:

squadJSON = require('./squads/squad' + whichSquad + '.json');

甚至更好,使用 ES6 template literal:

squadJSON = require(`./squads/squad${whichSquad}.json`);

使用require() 的一个显着区别是它解析来自__dirname 的相对路径,这是当前模块的目录路径,而fs methods resolve relative paths 使用process.cwd() 或“当前工作目录”。它是 shell 会话中的目录,node 从中执行程序的主模块。

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

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

【讨论】:

  • 非常正确,require 读取 JSON 文件要方便得多。另外,require 总是相对于它被调用的文件进行解析,而我相信 fs.readFileSync 会根据当前工作目录进行解析(除非您专门使用 __dirname 解析)。
  • 抱歉,但无论我使用 Require 还是指定编码,它都会返回完全相同的内容...@sidney
  • @ConradScherb 这通常是这种情况,这意味着模块 require() 的调用来自与您调用的文件位于同一目录中(或 isnode.
  • @PatrickRoberts 那么在这种情况下,解决方案是什么?
  • @ConradScherb 我添加了一些示例,希望能阐明它们之间的差异。首先没有问题,信息只是为了让您了解细微差别。
猜你喜欢
  • 1970-01-01
  • 2020-08-07
  • 2021-12-30
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
  • 2017-10-01
  • 1970-01-01
相关资源
最近更新 更多