【问题标题】:ENOENT: no such file or directory, stat ERROR with Express MiddlewareENOENT:没有这样的文件或目录,使用 Express 中间件统计错误
【发布时间】:2017-01-22 08:48:49
【问题描述】:

这似乎是文件路径的常见错误,但我的问题更奇怪,因为代码昨天运行良好但今天不行(而且我没有更改任何代码)。我的文件夹目录很简单:

-node_modules
-public
    -css
    -js
    control_panel.html
    index.html
app.js
packages.json

我在 app.js 中使用 Express 中间件来帮助渲染文件。

var express = require("express");
var app = express();

app.use(express.static("public"));

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

app.get('/control_panel', function get(req, res) {
    res.sendFile('/control_panel.html');
});

当我尝试在浏览器中打开 index.html 时,没有问题,一切正常。但是,当我尝试在浏览器中打开 control_panel.html 时,我得到了Error: ENOENT: no such file or directory, stat '/control_panel.html' at Error (native)

导致问题的原因是什么?

【问题讨论】:

  • res.sendFile('/control_panel.html') 将不起作用。 control_panel.html 文件不在路径 '/control_panel.html' 中。另外,无论如何,您应该在这些路线上使用express.static('public')
  • @jfriend00 当我指定app.use(express.static("public")); 时,应用程序不会开始在“public”文件夹下查找文件。在这种情况下,control_panel.html 在 public
  • 不适用于res.sendFile()express.static() 仅适用于传入请求。 res.sendFile() 需要文件的真实有效路径。
  • @jfriend00 是否有替代使用 res.sendFile() 处理 html 文件的方法?
  • 替代用于什么目的?静态文件应使用express.static() 提供,没有理由为静态文件手动创建路由。

标签: node.js express path response webstorm


【解决方案1】:

根据你的情况的一些相关点:

  1. 所有静态资产(html 文件、图像、CSS 文件、客户端脚本文件等)都应使用适当的express.static(...) 语句自动提供服务。您不应该为静态资源创建单独的路由。

  2. 要使express.static() 正常工作,您必须将所有静态资源定位在仅包含公开文件的目录层次结构中。

  3. 您的私有服务器端文件(例如 app.js)不应位于该公共目录层次结构中。他们应该在别处。

  4. 您到express.static() 的路径不正确。

  5. res.sendFile() 的路径不正确。

我建议您解决以下问题:

  1. 将 app.js 移出 public 目录。它需要在私有目录中。我建议 public 目录是 app.js 所在的子目录。
  2. 然后,app.js 中的 express.static() 将用于为您的静态 HTML 文件提供服务。
  3. 然后,您可以删除 index.htmlcontrol_panel.html 的两条路线,因为 express.static() 应该为它们提供服务。

这是一个可行的层次结构:

server
    app.js
    public
        index.html
        control_panel.html

还有,像这样的 app.js:

var express = require("express");
var app = express();

// serve static files found in the public sub-directory automatically
app.use(express.static("public")); 

app.listen(80);

【讨论】:

  • 目前需要注意的一点是,app.js 实际上位于公用文件夹之外,如问题中的图片所示。也许那张照片令人困惑
  • @b11 - 是的,图片很混乱。
  • 对不起,这是webstorm的截图
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2017-10-07
  • 2016-09-01
  • 2020-06-03
  • 2016-07-20
  • 1970-01-01
  • 2019-03-09
相关资源
最近更新 更多