如何从 Nodejs 中的不同路径读取 json?
How to read json from different path in Nodejs?
当我在我的 node express 项目中有一个没有路由器和控制器的非常简单的文件结构时,我可以使用 fs-extra
.
但是当我把一些文件夹加到文件夹里(并且学习了routers+controller)的时候,我现在很吃力。
如果我这样做,通过有一个 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."
})
}
}
我收到一个错误:
Error fs readJSON: The "path" argument must be of type string or an
instance of Buffer or URL. Received an instance of Object
而如果我像这样将字符串路径直接放到 readJson 中:
const emojis = await fs.readJson("../../jsons/emojis.json")
我收到一个错误:
Error fs readJSON: ENOENT: no such file or directory, open
'./emojis.json'
编辑:文件路径绝对正确,就像我提到的我使用 VSCode.
emojis.json json 文件在 "jsons" 文件夹下,该文件夹与控制器文件相距 2 个文件夹。
这应该可以解决:
const path = require("path");
const fullPath = path.resolve("../../jsons/emojis.json");
const emojis = await fs.readJson(fullPath);
如果您尝试为 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
.
手动构建路径
当我在我的 node express 项目中有一个没有路由器和控制器的非常简单的文件结构时,我可以使用 fs-extra
.
但是当我把一些文件夹加到文件夹里(并且学习了routers+controller)的时候,我现在很吃力。
如果我这样做,通过有一个 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."
})
}
}
我收到一个错误:
Error fs readJSON: The "path" argument must be of type string or an instance of Buffer or URL. Received an instance of Object
而如果我像这样将字符串路径直接放到 readJson 中:
const emojis = await fs.readJson("../../jsons/emojis.json")
我收到一个错误:
Error fs readJSON: ENOENT: no such file or directory, open './emojis.json'
编辑:文件路径绝对正确,就像我提到的我使用 VSCode.
emojis.json json 文件在 "jsons" 文件夹下,该文件夹与控制器文件相距 2 个文件夹。
这应该可以解决:
const path = require("path");
const fullPath = path.resolve("../../jsons/emojis.json");
const emojis = await fs.readJson(fullPath);
如果您尝试为 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
.