ENOENT:没有这样的文件或目录,带有Express Middleware的stat ERROR

时间:2016-09-14 13:52:41

标签: node.js express path response webstorm

这似乎是文件路径的一个常见错误,但我的问题是一个但更奇怪,因为代码工作正常,但今天没有(我没有更改任何代码)。我的文件夹目录非常简单:

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

enter image description here

我在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)

导致问题的原因是什么?

1 个答案:

答案 0 :(得分:2)

根据您的具体情况提出一些相关要点:

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

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

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

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

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

  6. 我建议你做些什么来解决问题:

    1. 将app.js移出public目录。它需要位于私人目录中。我建议public目录是app.js所在的子目录。
    2. 然后,express.static()中的app.js将使用属性为您的静态HTML fiel提供服务。
    3. 然后,您可以移除index.htmlcontrol_panel.html的两条路线,因为express.static()应为其提供服务。
    4. 这是一个可行的层次结构:

      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);