Javascript Node.js应用程序不提供没有根路径的静态网页
我正在node.js中编写一个简单的应用程序,由于某种原因,我在尝试提供html页面时遇到了错误“TypeError:path必须是绝对路径或指定res.sendFile的root”。这个错误不应该发生,因为我使用了一个express中间件来指定可以找到这个文件的文件夹。那么为什么我会遇到这个问题呢 我的应用程序结构如下所示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
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,还有其他方法吗?也许是一种我可以使用静态路由中间件的方法?