【问题标题】:How to read json from different path in Nodejs?如何从 Nodejs 中的不同路径读取 json?
【发布时间】:2020-04-27 05:26:47
【问题描述】:

当我的 node express 项目中没有路由器和控制器的文件结构非常简单时,我可以使用 fs-extra 轻松读取并正确返回 json 文件的内容。

但是当我在文件夹中添加一些文件夹(并学习路由器+控制器)时,我现在很难过。

如果我这样做,通过使用 require 变量(我利用 VSCode 的自动完成功能来确保我的文件路径正确):

const fs = require("fs-extra")
const json = require("../../jsons/emojis.json")

exports.getEmojis = async (req, res) => {
  try {
    const emojis = await fs.readJson(json)
    const pretty = JSON.stringify(emojis, null, 4)
    res.setHeader("Content-Type", "application/json")
    res.send(pretty)
  } catch (err) {
    console.log("Error fs readJSON: " + err.message)
    res.status(500).send({
      message: "Error getting emojis."
    })
  }
}

我收到一个错误:

错误 fs readJSON:“路径”参数必须是字符串类型或 Buffer 或 URL 的实例。收到一个 Object 的实例


而如果我像这样将字符串路径直接放到 readJson 中:

const emojis = await fs.readJson("../../jsons/emojis.json")

我收到一个错误:

错误 fs readJSON: ENOENT: 没有这样的文件或目录,打开 './emojis.json'


编辑:文件路径绝对正确,就像我提到的我使用 VSCode。

emojis.json json 文件位于“jsons”文件夹下,该文件夹距离控制器文件 2 个文件夹。

【问题讨论】:

  • 我认为你应该检查路径。仔细看看
  • 所以,这个错误显然是由fs.readJson(json)引起的。这意味着 json 变量是有问题的。该变量来自const json = require("../../jsons/emojis.json"),这可能意味着json 是一个对象,而不是一个字符串,这与你得到的错误一致,它告诉你json 是一个对象。当您使用 require() 读取 JSON 数据时,通常会返回一个对象。

标签: node.js fs-extra


【解决方案1】:

这应该解决它:

const path = require("path");
const fullPath = path.resolve("../../jsons/emojis.json");
const emojis = await fs.readJson(fullPath);

【讨论】:

  • 有趣,它现在说:Error fs readJSON: ENOENT: no such file or directory, open '/Users/glenn/GIT/jsons/emojis.json' 字符串路径缺少项目路径。
  • 你可以摆弄path.resolve("./jsons/emojis.json");
【解决方案2】:

如果您尝试为 require() 以外的其他内容指定相对于您自己的控制器文件的路径,那么您必须手动组合路径 __dirname 这是您的模块目录。因此,如果您现在尝试这样做:

const emojis = await fs.readJson(fullPath);

您需要将fullPath 构建为相对于您自己的模块目录:

const fullPath = path.join(__dirname, "../../jsons/emojis.json");
const emojis = await fs.readJson(fullPath);

现在,我无法在您的屏幕截图中看到您的控制器文件在目录层次结构中的确切位置,所以我不完全确定“../../jsons/emojis.json”是您的控制器文件所在的__dirname 的正确相对路径,因此您可能需要对其进行调整。或者,您可以向我们展示整个层次结构,包括相关控制器文件的位置,我们可以提供更具体的建议。

但是,这里的重点是 require() 做了一些描述 here 的魔术,看起来与您的模块目录相关,但所有其他 fs 函数只使用当前目录,并且由您的整个应用程序设置启动,而不是加载给定模块的位置。因此,如果您想加载与您自己的模块相关的内容,则必须使用 __dirname 手动构建路径。

【讨论】:

    猜你喜欢
    • 2018-08-31
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多