使用 Node.JS,如何将 JSON 文件读入(服务器)内存?

IT技术 javascript json node.js
2021-01-26 16:33:24

背景

我正在对 Node.js 进行一些实验,并希望将 JSON 对象从文本文件或 .js 文件(哪个更好??)读取到内存中,以便我可以从代码中快速访问该对象。我意识到有像 Mongo、Alfred 等这样的东西,但这不是我现在需要的。

问题

如何使用 JavaScript/Node 从文本或 js 文件中读取 JSON 对象并读取到服务器内存中?

6个回答

同步:

var fs = require('fs');
var obj = JSON.parse(fs.readFileSync('file', 'utf8'));

异步:

var fs = require('fs');
var obj;
fs.readFile('file', 'utf8', function (err, data) {
  if (err) throw err;
  obj = JSON.parse(data);
});
我不敢相信找到这么简单的东西是如此困难。我从谷歌得到的每个答案都是在做一个 HTTPRequest 或使用 JQuery 或在浏览器中做
2021-03-17 16:33:24
两点:(1)同步答案应该是let imported = require("file.json")(2) JSON.parse 必须是异步的,因为我用这段代码将一个 70mb 的 JSON 文件作为对象加载到内存中。这种方式需要几毫秒,但如果我使用require(),它会突突
2021-03-17 16:33:24
为了完整性。他们存在一个名为jsonfile的 npm
2021-03-18 16:33:24
对于在 2019 年及以后找到这个答案的人来说,Node.js 已经通过require. 只需使用let data = require('./yourjsonfile.json')即可(书注说明,如果 require 的性能影响了您的代码,那么您将遇到的问题远远超出“想要加载 .json 文件”)
2021-03-29 16:33:24
我认为 JSON.parse 是同步的,它直接来自 v8,这意味着即使使用 Async 方式,人们也必须小心处理大型 JSON 文件。因为它会占用节点。
2021-04-07 16:33:24

我发现最简单的方法是使用requireJSON 文件的路径。

例如,假设您有以下 JSON 文件。

测试文件

{
  "firstName": "Joe",
  "lastName": "Smith"
}

然后,您可以使用 require

var config = require('./test.json');
console.log(config.firstName + ' ' + config.lastName);
“require”旨在用于加载您在应用程序的整个生命周期中使用的module或配置文件。使用它来加载文件似乎不正确。
2021-03-18 16:33:24
只是让人们知道,如果我没记错的话,require在节点中同步运行。深入这里
2021-03-25 16:33:24
这种方法的另一个问题/好处是,除非您专门删除缓存的实例,否则缓存所需的数据
2021-03-27 16:33:24
我会说这可能是一个安全威胁。如果您加载的 json 文件包含 JS 代码,require它会运行该代码吗?如果是这样,那么您真的需要控制 json 文件的来源,否则攻击者可能会在您的机器上运行恶意代码。
2021-03-29 16:33:24
这是小型 DevOps 脚本或批处理操作的完美解决方案。您必须在人工时间与性能之间取得平衡。至于您可以提交内存并在这些适当的情况下快速使用的东西,这是最重要的。并非每项任务都涉及大数据™ 和敌对的执行环境。
2021-04-01 16:33:24

异步是有原因的!向@mihai 扔石头

否则,这是他用于异步版本的代码:

// Declare variables
var fs = require('fs'),
    obj

// Read the file and send to the callback
fs.readFile('path/to/file', handleFile)

// Write the callback function
function handleFile(err, data) {
    if (err) throw err
    obj = JSON.parse(data)
    // You can now play with your datas
}
它的存在是有原因的......除非你想要同步。
2021-03-15 16:33:24
同意:),也添加了异步
2021-03-18 16:33:24
太好了 :-) 不过我不喜欢内联回调,它会导致我宁愿避免的回调噩梦。
2021-04-09 16:33:24

至少在 Node v8.9.1 中,你可以这样做

var json_data = require('/path/to/local/file.json');

并访问 JSON 对象的所有元素。

@DavidA.Gray 问题希望能够将对象作为对象而不是字符串来访问。除了单例问题,卢卡斯提到这个答案很好。
2021-03-11 16:33:24
这种方法只加载一次文件。如果您将更改file.json新的要求(不重新启动程序)后的数据将来自第一次加载。我没有支持这个的来源,但我在我正在构建的应用程序中有这个
2021-03-20 16:33:24
您的答案非常不完整。得到的是一个对象,它甚至不费心去实现 tostring()。
2021-03-20 16:33:24
使用 require 还将执行文件中的任意代码。这种方法是不安全的,我建议不要使用它。
2021-03-31 16:33:24

在 Node 8 中,您可以使用内置util.promisify()来异步读取这样的文件

const {promisify} = require('util')
const fs = require('fs')
const readFileAsync = promisify(fs.readFile)

readFileAsync(`${__dirname}/my.json`, {encoding: 'utf8'})
  .then(contents => {
    const obj = JSON.parse(contents)
    console.log(obj)
  })
  .catch(error => {
    throw error
  })
.readFile已经是异步的,如果你正在寻找同步版本,它的名字是.readFileSync.
2021-03-17 16:33:24
如果你想使用Promise,还有fs/promisesNode 10。 注意:API 是实验性的:nodejs.org/api/fs.html#fs_fs_promises_api
2021-03-23 16:33:24
@Kip CodeSandBox 怎么样?
2021-03-26 16:33:24
@Aternus.readFile异步的,但不是async意思是,函数没有用async关键字定义,也没有返回 Promise,所以你不能做await fs.readFile('whatever.json');
2021-04-09 16:33:24