Javascript Node.js应用程序不提供没有根路径的静态网页

Javascript Node.js应用程序不提供没有根路径的静态网页,javascript,node.js,rest,express,web-applications,Javascript,Node.js,Rest,Express,Web Applications,我正在node.js中编写一个简单的应用程序,由于某种原因,我在尝试提供html页面时遇到了错误“TypeError:path必须是绝对路径或指定res.sendFile的root”。这个错误不应该发生,因为我使用了一个express中间件来指定可以找到这个文件的文件夹。那么为什么我会遇到这个问题呢 我的应用程序结构如下所示 MyApp public login.html app.js var express = require("express"); var

我正在node.js中编写一个简单的应用程序,由于某种原因,我在尝试提供html页面时遇到了错误“TypeError:path必须是绝对路径或指定res.sendFile的root”。这个错误不应该发生,因为我使用了一个express中间件来指定可以找到这个文件的文件夹。那么为什么我会遇到这个问题呢

我的应用程序结构如下所示

MyApp
    public
        login.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);
我的html页面是在app.js中提供的,如下所示

MyApp
    public
        login.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(uu dirname+'/public/login.html')”,但我不应该这样做,因为我使用的是中间件。有什么想法吗?

添加提供完整路径的函数,让我们调用此函数
$

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

    res.sendFile($("login.html"));
这样,您就不需要为每一次
sendFile
调用手动包含根路径。

此行

app.use(express.static("public"));
不会做你认为它会做的事

它不为每个节点函数设置默认文件夹,事实上它不为其他节点函数做任何事情

它只是说,如果Web服务器收到请求,首先查看该文件夹中是否存在这样的文件,如果存在,则提供该文件

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

然而,这条线

res.sendFile("login.html");
在当前工作目录中查找文件
login.html
,或者换句话说,在节点脚本运行的地方,它与静态路由没有任何关系,事实上,无论脚本在哪里运行,获取该文件的正确方法就是

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

由于这是正确的路径,这是
sendFile
查找文件所必需的。

这有点令人困惑,您是否希望节点在提供
sendFile()
文件名时应该查看“public”文件夹?不会的,只有直接访问的静态文件才会以这种方式加载,因此名为“static”。@adeneo是的,我希望它会出现在公用文件夹中,因为login.html是static@AbdennourTOUMI我正在使用Mac OS X El CapitanOk。它与我拥有的操作系统相同…我将检查login.html不是静态文件吗?@OneMoreQuestion-如果您像
http://mywebsite/login.html
您甚至可以通过静态路由获得它,但是这并不会使
sendFile
突然使用为Web服务器设置的静态路由。重点是,静态路由与节点中的其余功能无关,它只允许Web服务器向浏览器提供静态文件。您是说“sendFile”不是正确的方法吗?我想使用中间件,我也尝试了“render”,但后来遇到了视图引擎渲染问题。如果我想利用中间件,有没有更好的方法?我是说
sendFile
需要文件的正确完整路径,它与
.static(“public”)
毫无关系。如果您需要使用
sendFile
,请这样做,但它不会因为您设置了静态路由而在
/public
中查找该文件!明白了。如果我不使用sendFile,还有其他方法吗?也许是一种我可以使用静态路由中间件的方法?