【问题标题】:fs vs require JSONfs 与需要 JSON
【发布时间】:2016-09-29 05:52:28
【问题描述】:

首先我会说我是 NodeJS 的新手,但我已经使用 PHP 开发多年了(我知道的并不多)。

我最近开始修补Node,发现了一些奇怪的东西,希望有人能帮忙

我有一个文件调用local.js,这会拉入一个.JSON 文件,该文件用于设置oAuth keys 等。

我最初提取这个文件的方式是:

var fs = require('fs')
var settings = fs.readFileSync('./config/settings.json', 'utf8')

我发现我无法通过settings.keysettings 中的JSON 读取值,这将给我undefined

在下面测试另一种方法

var settings = require('./config/settings.json')

允许我通过 settings.key 读取来自 JSON 的值

我想知道为什么会这样?

【问题讨论】:

    标签: node.js fs


    【解决方案1】:

    fs.readFileSync() 只是读取文件中包含的数据,但不解析它。

    为此,您需要一个额外的步骤:

    var settings = JSON.parse( fs.readFileSync('./config/settings.json', 'utf8') );
    

    使用require()自动解析数据。

    【讨论】:

    • 感谢@robertklep 的回复,实际上我之前也曾在某个时候使用过JSON.parse,但我遇到了奇怪的错误,但这可能是由于其他原因。再次感谢:)
    • 另外,require可以省略.json扩展名,它会缓存文件内容,而fs方式如果你多次使用它会重新读取文件。
    • @MattStephens 如果您在 JSON.parse 时看到奇怪的错误,那么很可能是 json 架构已损坏,或者您提供的不是字符串而是缓冲区。
    • @VladMiller 实际上正在考虑...我认为这是我的构造函数的问题,与此无关。
    • @Lenny 我认为通过require() 加载JSON 非常安全(只要文件具有.json 扩展名,因为require 使用扩展名来确定如何解析数据)。
    【解决方案2】:

    Require 将参数中提供的路径中的所有代码获取到您的变量中。在第一种情况下,require('fs') 实际上是 require('/some/path/fs.js') 之类的简写,require.js 将代码存储在变量内的路径(模块)中。该模块包含readFileSync 方法,当然,它会将所提供文件的内容读入settings。现在require 与 JSON 一样有效,因为如果您 require 一个 JSON 文件,require.js 将解析它并将其加载到您的变量中,您可以像使用基本 js 对象一样使用它。

    【讨论】:

      【解决方案3】:

      函数fs.readFileSync() 只读取文件的内容作为字符串。

      require() 将读取文件的内容并使用JSON.parse() 函数对其进行解析,因此您将获得一个 json 对象作为回报。

      如果您在执行之间不修改 json 文件,最好使用require()

      【讨论】:

        猜你喜欢
        • 2016-05-02
        • 2013-07-09
        • 1970-01-01
        • 2023-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-23
        相关资源
        最近更新 更多