2016-07-25 51 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打電話。

相關問題