2016-07-25 90 views
3

我正在写一个简单的应用程序在node.js,出于某种原因我得到错误“TypeError:路径必须是绝对的或指定根目录res.sendFile”when试图提供我的HTML页面。这个错误不应该发生,因为我使用了一个明确的中间件来指定可以找到这个文件的文件夹。那么,为什么我会遇到这个问题?Node.js应用程序没有提供静态网页没有根路径

我的应用程序结构看起来像这样

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');“相反,但我不应该因为我正在使用中间件。有任何想法吗?

+0

这有点令人困惑,你是否期望当你给sendFile()一个文件名时Node应该在“public”文件夹中查找?它不会,只有直接访问静态文件时才会这样加载,因此名称为“static”。 – adeneo

+0

什么是您的操作系统? –

+0

@adeneo是的,我期待它在公用文件夹中查找,因为login.html是静态的 – OneMoreQuestion

回答

0

此行

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

不会做你认为它!

它确实不是设置每个节点功能的默认文件夹,实际上它不会为其他节点功能做任何事情。

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

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

不过,此行

res.sendFile("login.html"); 

在当前工作目录中查找该文件login.html,或者在你的节点脚本运行换句话说,它没有任何事情做的静态路由,其实正确的方法来获取文件,而不管你的脚本运行的位置的,正是做

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

因为这是正确的道路,这是需要sendFile找到该文件。

+0

等待是不是一个静态文件login.html? – OneMoreQuestion

+0

@OneMoreQuestion - 当然,如果你像访问'http:// mywebsite/login.html'那样,你甚至可以用一个静态**路由**来获取它,但是这并不会使'sendFile'突然工作为web服务器*设置的静态路由。需要指出的是,静态路由与Node中的其他功能无关,它只允许Web服务器向浏览器提供静态文件。 – adeneo

+0

你是否在说“sendFile”不是正确的方法是我想使用中间件,我试过“渲染”,但后来我遇到了视图引擎渲染问题。如果我想利用中间件,有更好的方法吗? – OneMoreQuestion

0

添加功能,让你的全路径,让我们调用这个函数$

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

然后:

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

到这一点,你不需要手动包括根路径每个sendFile打电话。

相关问题