如何 res.sendFile() 位于 Express.js webapp 的不同目录中的文件?

发布于 2025-01-11 05:54:22 字数 1174 浏览 0 评论 0原文

我在控制器文件夹中有这个:

//controler.js
exports.serve_sitemap = (req, res) => {
  res.sendFile("../../sitemap.xml");
  // or
  // res.send(__dirname + "./sitemap.xml")
  // But neither of these work
};

此导出的函数被导入到 routes 目录内的文件中

const { serve_sitemap } = require('../controllers/indexer')

var router = require('express').Router()

router.get("/sitemap", serve_sitemap)

module.exports = router

目前,当我尝试在 localhost:3000/sitemap< 获取站点地图时,出现 404 错误/code>

文件夹结构:
文件夹结构

之前,我在index.js 中有同样的东西,它是入口点。

app.get("/sitemap", (req, res) => {
   res.sendFile(__dirname + "/sitemap.xml");
});

这工作得很好,直到我决定重组项目

  • 时,如何在使用 res.send() 时从子目录中的文件引用位于根目录中的 sitemap.xml 文件?
  • 如何获取项目目录根目录的绝对路径,然后我可以将文件名附加到路径中。这可以解决我可能遗漏一些明显的东西的问题

。在这种情况下,请帮帮我。

任何建议都感激地接受。提前致谢

I have this inside controllers folder:

//controler.js
exports.serve_sitemap = (req, res) => {
  res.sendFile("../../sitemap.xml");
  // or
  // res.send(__dirname + "./sitemap.xml")
  // But neither of these work
};

This exported function is imported in a file inside the routes directory

const { serve_sitemap } = require('../controllers/indexer')

var router = require('express').Router()

router.get("/sitemap", serve_sitemap)

module.exports = router

Currently I am getting a 404 error when I try to get the sitmap at localhost:3000/sitemap

Folder Structure:
folder structure

Before, I had the same thing in index.js which is the entry point.

app.get("/sitemap", (req, res) => {
   res.sendFile(__dirname + "/sitemap.xml");
});

This was working perfectly, until I decided to restructure the project

  • How can I refer to the sitemap.xml file that is located in the root directory from a file that is in a sub-directory when using res.send()?
  • How can I get the absolute path to the root of the project directory, then I can append the file name to the path. This can solve the issse

I maybe missing something obvious. In that case, please help me out.

Any suggestion gratefully accepted. Thanks in advance

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

反差帅 2025-01-18 05:54:22

您为什么认为 res.sendFile(__dirname + "./sitemap.xml") 可以工作?

首先 __dirname + "./sitemap.xml" 不是连接路径的方式,您应该使用 join 尤其是如果您的第二条路径以 ./ 开头。并且控制器目录下没有sitemap.xml文件:
__dirname + "./sitemap.xml" 会产生类似 /path/to/project/src/controller/./sitemap.xml 的结果

,为什么应该 “../../sitemap.xml”工作。如果您只有 "../../sitemap.xml" 它是相对于工作目录的,这是(我猜)index.js 所在的目录。因此 "../../sitemap.xml" 将根据 /path/to/project 进行解析,因此 /path/to/project/。 ./../sitemap.xml

因此,要么是 res.sendFile("./sitemap.xml") (相对于 index.js),要么是 res.sendFile(path.join( __dirname, "../../sitemap.xml")) (相对于控制器)。

Why do you think that res.sendFile(__dirname + "./sitemap.xml") would work?

First of all __dirname + "./sitemap.xml" is not how paths should be concatenated you should use join instead especially if your second path starts with ./. And there is no file sitemap.xml in the directory of the controller:
__dirname + "./sitemap.xml" would result in something like /path/to/project/src/controller/./sitemap.xml

And why should "../../sitemap.xml" work. If you only have "../../sitemap.xml" it is relative to the working directory which is the one where (i guess) index.js is located. So "../../sitemap.xml" will be resolved based on /path/to/project, so /path/to/project/../../sitemap.xml.

Due to that is either res.sendFile("./sitemap.xml") (relative to index.js) or res.sendFile(path.join(__dirname, "../../sitemap.xml")) (relative to the controller).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文