ChatGPT解决这个技术问题 Extra ChatGPT

node.js 中是否需要 json

我想在我的 JavaScript 代码中包含几个 JSON 文件,它们与我的 JavaScript 源文件位于同一目录中。

如果我想包含另一个 JavaScript 文件,我可以简单地使用 require。现在我使用 readFileSync__dirname 来获取 JSON,我认为这是一种丑陋的方式。

是否有类似的要求使我能够加载 JSON 文件?

看到这个类似的问题:stackoverflow.com/questions/4662851/…
@coen“包含JSON文件”是什么意思?阅读并解析它?如果是,可能重复:stackoverflow.com/questions/5726729/…
是的;读取和解析。但这是专门读取文件,类似于读取js文件,所以这不是重复的,goatslacker的答案仍然有效。

F
Frank Nocke

从节点 v0.5.x 开始,是的,您可以像需要 js 文件一样需要 JSON。

var someObject = require('./somefile.json')

在 ES6 中:

import someObject from ('./somefile.json')


您需要使用 require('./somefile.json') 假设文件位于同一目录中(注意点和斜杠)。
有一个问题。结果将被缓存!因此,如果您出于某种原因需要再次加载数据(例如在 cronjob 中),您将得到相同的旧结果。
注意:扩展 .json 似乎很重要
格式良好的 json 也有帮助
请注意,如果您确实希望将 .json 以外的其他文件解析为 json,您可以教 require 如何读取它。 require.extensions['.har'] = require.extensions['.json']; var blar = require('./file.har'); 现在将被视为 json
s
serkan

JSON 文件不需要显式的导出语句。您无需导出即可将其用作 Javascript 文件。

因此,您可以仅将 require 用于有效的 JSON 文档。

数据.json

{
  "name": "Freddie Mercury"
}

main.js

var obj = require('data.json');

console.log(obj.name); 
//Freddie Mercury

r
rajmobiapp

最常见的两种

第一种方式:

let jsonData = require('./JsonFile.json')

let jsonData = require('./JsonFile') // 如果我们省略 .json 也可以

或者

import jsonData from ('./JsonFile.json')

第二种方式:

1) 同步

const fs = require('fs')
let jsonData = JSON.parse(fs.readFileSync('JsonFile.json', 'utf-8'))

2) 异步

const fs = require('fs')
let jsonData = {}
fs.readFile('JsonFile.json', 'utf-8', (err, data) => {
  if (err) throw err

  jsonData = JSON.parse(data)
})

注意:1)如果我们改变了 JsonFile.json ,即使我们重新运行 require('./JsonFile.json') 也不会得到新的数据

2) fs.readFile 或 fs.readFileSync 将始终重新读取文件,并获取更改


请注意,fs 方法使用启动节点的目录作为起点,而不是执行读取的源代码所在的目录,而“require”方法使用相对于导入源代码位置的路径。因此,只要将内容存储在不同的文件夹中,两种方法之间的路径就会有所不同。
R
Raynos

不可以。请使用 readFilereadFileSync(后者仅在启动时使用)。

或使用现有的库,如

cjson

或者将您的配置写入 js 文件而不是 json 文件,例如

module.exports = {
  // json
}

@coen 是的,我们总是使用 __dirname 来制作相对路径。
遇到这种情况,它将在本地导入 JSON,但不在 AWS 中我的 EC2 实例上的 docker 容器中......我没有尝试配置 mime 类型等等,而是切换到 JS 而不是 JSON。希望这可以帮助某人。
s
som

一个用于节点 15 模块的漂亮的非缓存异步单线:

import { readFile } from 'fs/promises';

const data = await readFile('{{ path }}').then(json => JSON.parse(json)).catch(() => null);

d
dreamLo

您可以使用 node.js v14 实验性 json 模块标志导入 json 文件。更多详情here

文件.js

import data from './folder/file.json'

export default {
  foo () {
    console.log(data)
  }
}

你用 node --experimental-json-modules file.js 调用它


I
Igor Litvinovich

您甚至可以在不指定扩展名 .json 的情况下使用 JSON 的 require。它可以让您将文件扩展名更改为 .js,而无需对导入进行任何更改。

假设我们在同一目录中有 ./myJsonFile.json 。

const data = require('./myJsonFile')

如果将来您将 ./myJsonFile.json 更改为 ./myJsonFile.js,则在导入中不应更改任何内容。


这令人困惑。您提出的想要将 json 要求更改为 js 要求的示例是想象力的延伸。您的答案应该坚持事实并避免假设情况。我还建议您假设的文件名 ./myJsonFile.js 令人困惑。如果它具有 .js 扩展名,为什么它会被称为“myJsonFile”?不过还有一个有用的事实:如果您使用 require('./file') 并且 file.jsfile.json 都存在,那么它将使用 file.js
T
Thanawat Gulati

您可以使用模块来创建需求。

import { createRequire } from 'module'
const require = createRequire(import.meta.url)
const foo = require('./foo.js')

T
Thiago Dantas

如果您使用的是 typescript,您可以在 tsconfig.json 中添加一个名为 resolveJsonModule: true 的新字段,然后您可以像这样导入任何 .json 文件的所有信息:

import * as jsonfile from "./path/to/json"