【问题标题】:Node.js application not serving static webpage without root pathNode.js 应用程序不提供没有根路径的静态网页
【发布时间】:2016-11-29 05:52:49
【问题描述】:

我正在 node.js 中编写一个简单的应用程序,由于某种原因,我在尝试提供我的 html 时收到错误“TypeError: path must be absolute or specified root to res.sendFile”页。这个错误不应该发生,因为我使用了一个快速中间件,它指定了可以找到这个文件的文件夹。那我为什么会遇到这个问题?

我的应用结构如下所示

MyApp
    public
        login.html
    app.js

我的 html 页面像这样在 app.js 中提供

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

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

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

app.listen(3000);

我知道要解决这个问题,我可以执行“res.sendFile(__dirname + '/public/login.html');”相反,但我不应该这样做,因为我使用的是中间件。有什么想法吗?

【问题讨论】:

  • 这有点令人困惑,当您给sendFile() 一个文件名时,您是否期望Node 应该在“公共”文件夹中查找?它不会,只有直接访问的静态文件才会以这种方式加载,因此名称为“静态”。
  • @adeneo 是的,我希望它在公用文件夹中查找,因为 login.html 是静态的
  • @AbdennourTOUMI 我正在使用 Mac OS X El Capitan
  • 好的。它与我拥有的操作系​​统相同...我会检查

标签: javascript node.js rest express web-applications


【解决方案1】:

这一行

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

没有做你认为它做的事!

没有为每个 Node 函数设置默认文件夹,实际上它对其他 Node 函数没有任何作用。

它只是说如果网络服务器收到请求,首先查看该文件夹以查看是否存在此类文件,如果存在,则提供该文件。

因此,它是静态文件的路由,最常用于 CSS 和 JavaScript 文件,当然还有任何其他不提供动态内容的静态文件。

但是,这一行

res.sendFile("login.html");

在当前工作目录中查找文件login.html,或者换句话说,您所在的Node脚本正在运行,它与静态路由没有任何关系,实际上是正确的获取方式无论您的脚本在哪里运行,该文件都是正确的

res.sendFile(__dirname + '/public/login.html');

因为这是正确的路径,sendFile 需要它才能找到文件。

【讨论】:

  • 等待 login.html 不是静态文件?
  • @OneMoreQuestion - 可以肯定的是,如果您像 http://mywebsite/login.html 一样访问它,您甚至可以使用静态 route 来获取它,但这不会让 sendFile 突然使用为为网络服务器设置的静态路由。重点是,静态路由与 Node 中的其他功能无关,它只是让网络服务器向浏览器提供静态文件。
  • 你是说“sendFile”不是正确的方法是我想使用中间件,我也尝试过“render”,但后来我遇到了视图引擎渲染问题。如果我想利用中间件,有没有更好的方法?
  • 我的意思是sendFile 需要正确且完整的文件路径,它与.static("public") 完全无关。如果您需要使用sendFile,请这样做,但它不会因为您设置了静态路由而在/public 中查找文件!
  • 明白了。如果我不使用 sendFile,还有其他方法吗?也许是我可以使用静态路由中间件的一种方式?
【解决方案2】:

添加为您提供完整路径的函数,我们将此函数称为$

var $=(file)=>`${__dirname}/public/${file}`;

然后:

    res.sendFile($("login.html"));

这样,您无需为每个sendFile 调用手动包含根路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2016-02-29
    • 2015-08-07
    • 2015-03-13
    相关资源
    最近更新 更多