【问题标题】:Why do I need to specify an absolute path for res.sendFile() instead of relative one?为什么我需要为 res.sendFile() 指定绝对路径而不是相对路径?
【发布时间】:2021-09-01 14:16:04
【问题描述】:

假设我的 index.js 与我的 index.html 位于同一目录中。还有一个包含styles.css的文件夹css。

/
  |- index.js
  |- index.html
  |- css/styles.css

在 index.html 中,我可以使用相对路径指定我的 css 样式,它将指向相对于我的 index.html 的 css/styles.css

  <link rel="stylesheet" href="css/styles.css">

但是,在 index.js 中,当我的 express 服务器收到 GET 请求而不是

app.get("/", function(req, res) {
  res.sendFile("index.html"); // type Error
});

我必须指定一个绝对路径

app.get("/", function(req, res) {
  res.sendFile(__dirname + "/index.html");
});

考虑 index.html 在可以正确定位(显示无错误)相对路径 css/styles.css 时的行为。为什么不能对 index.js 应用相同的逻辑?

为什么文件系统的行为与我在 index.html 中指定相对路径时的行为不同?

注意:我知道另一种方法是指定根。但是,问题的重点是为什么我必须使用绝对路径而不是相对路径(为什么会出错?)

【问题讨论】:

  • 您不需要手动发送 index.html。如果您只需使用 app.use( express.static( assetsFolderPath ) ) 指定其所在的文件夹,Express 将为您完成此操作

标签: javascript express http path web-development-server


【解决方案1】:

您可以使用相对路径。该路径刚刚从当前工作目录解析,即:

  • 可能是您的开发环境中 Node.js 项目的根目录(而不是该项目中静态文件的根目录)
  • 当您拥有生产环境(可能通过 systemd 通过 PM2 启动它或成为 AWS lambda 函数)时,可能会出现 (a) 不同且 (b) 不太有用的地方

使用__dirname 计算绝对路径意味着您明确地使其相对于 JS 模块的位置,当您将静态文件捆绑在一起时,该模块始终位于相对于您的静态文件的相同位置。

【讨论】:

  • 嗨,感谢您的回答,但我认为从初学者的角度来看,我并没有完全掌握它。使用上面我的问题中提到的指定目录,我认为我的 node.js 项目目录也是我的 index.js (和其他文件)所在的位置? (我很确定我网站的所有内容都在一个文件夹中。我的问题中描述了该根文件夹的结构。它还包含 node_modules、package.json 等)
猜你喜欢
  • 1970-01-01
  • 2014-10-17
  • 2020-11-16
  • 2012-11-16
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多