如何 res.sendFile() 位于 Express.js webapp 的不同目录中的文件?
我在控制器文件夹中有这个:
//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
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您为什么认为
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 usejoin
instead especially if your second path starts with./
. And there is no filesitemap.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 toindex.js
) orres.sendFile(path.join(__dirname, "../../sitemap.xml"))
(relative to the controller).