Как читать json с другого пути в Nodejs? - PullRequest
0 голосов
/ 26 апреля 2020

Когда у меня была очень простая файловая структура без маршрутизаторов и контроллеров в моем проекте 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 JSON: Аргумент «путь» должен иметь тип string или экземпляр буфера или URL. Получил экземпляр объекта


В то время как если я положу путь к строке, чтобы прочитать Json, например, так:

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

Я получу ошибку:

Ошибка чтения файла JSON: ENOENT: нет такого файла или каталога, откройте './emojis.json'


Редактировать: путь к файлу абсолютно правильно, как я уже говорил, я использую VSCode.

emojis. json json файл находится в папке "jsons", и эта папка находится в 2 папках от файла контроллера.

enter image description here

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Если вы пытаетесь указать путь относительно вашего собственного файла контроллера для чего-то отличного от 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() делает некоторые маги c, описанные здесь , который выглядит относительно каталога вашего модуля, но каждая другая функция fs просто использует текущий каталог, и это определяется тем, как было запущено ваше общее приложение, а не тем, где данный модуль загружен. Так что, если вы хотите загрузить что-то относительно вашего собственного модуля, вы должны построить путь вручную, используя __dirname.

1 голос
/ 26 апреля 2020

Это должно решить это:

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