0

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

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

如果我这样做,通过一个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 的实例。收到一个对象实例


而如果我将字符串路径直接放入 readJson ,如下所示:

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

我收到一个错误:

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


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

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

在此处输入图像描述

4

2 回答 2

2

这应该解决它:

const path = require("path");
const fullPath = path.resolve("../../jsons/emojis.json");
const emojis = await fs.readJson(fullPath);
于 2020-04-26T19:58:58.857 回答
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()的一些魔法看起来与您的模块目录相关,但所有其他功能只使用当前目录,并且由您的整个应用程序的启动方式设置,而不是加载给定模块的位置。因此,如果您想加载与您自己的模块相关的内容,您必须使用.fs__dirname

于 2020-04-26T21:26:47.387 回答