2017-02-15 54 views
0

我想展示一個自定義的404頁面(包含html,css,img和ico)。當我替換第一個公共靜態主頁時,我知道我的404文件夾有效。但是,我相信我要麼不以正確的方式使用路線,要麼無法設置兩個靜態文件夾。對於Express.js 4.x,是否可以使用express.static兩次?

我不想使用模板視圖引擎。我希望在前端渲染一切。

我的項目如下所示:

404 
--index.html 
--error.css 
--404.jpg 
bin 
--server.js 
public 
--index.html 
routes 
--index.js 
package.json 
app.js 

app.js

... 
var index = require(./routes/index); //works 
... 
app.use(favicon(__dirname + '/public/content/images/logo.ico')); 
app.use(logger('dev')); 
app.use(jsonParser); 
app.use(urlencodedParser); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); //love it 
app.use('/', index); //this is fine 
... 

index.js

var express = require('express'); 
const path = require('path'); 
var router = express.Router(); 

router.use(function timeLog(req, res, next) { 
    console.log('Time: ', Date.now()); 
    next(); 
}); 

router.use('/', express.static(path.join(__dirname, './404'))); // HALP! 

module.exports = router; 

我已經將目錄播放(欲以「 404'vs'./404')。我通過輸入「localhost:3000/error」來測試。所以如果我的路徑是'/ error',它應該仍然使用父路徑:'/'。該文件指出,只要我的路線放在最後,它應該仍然有效。我在沒有使用express.static的情況下測試了它,並使用了一個在控制檯上打印錯誤的匿名函數。

是不可能使用express.static()兩次?

+1

是的,你可以使用多個'express.static()'。這只是中間件,你可以擁有儘可能多的中間件。他們將按照您註冊的順序進行搜索。目前還不清楚你想要完成什麼。對於靜態路由幫助,請顯示幾個示例,指出要在文件系統中加載特定文件的準確URL,並準確顯示文件在您的文件系統中的位置。 – jfriend00

+0

不可能使用任何路徑嗎?我想在主頁以外的任何路徑'/'上使用'express.static()'。換句話說,爲什麼'router.use('/',express.static(path.join(__ dirname,'./404');'not working?')在我移除靜態測試console.log時起作用。 – DeadSupra

+0

僅供參考,自定義404頁面不需要'express.static()'通常,您只需創建所需的404中間件處理程序作爲最後的中間件,然後創建'res.sendFile()'您想要的任何文件顯示404處理程序示例:https://expressjs.com/en/starter/faq.html。如果您只想將完成的HTML文件發送到客戶端(無服務器端呈現),請使用' res.sendFile(someLocalFilePath)'404中間件' – jfriend00

回答

0

將我的一些意見轉換爲答案,因爲這導致您的解決方案。

對於Express.js 4.x,可以使用express.static兩次嗎?

是的,您可以根據需要多次使用express.static()。它是中間件,如果找不到匹配請求的文件,它只會調用next()並允許中間件鏈繼續。因此,您可以根據需要添加儘可能多的文件,他們將分別按照您註冊的順序搜索匹配的文件。

我想顯示一個自定義的404頁面(包含html,css,img和ico)。當我替換第一個公共靜態主頁時,我知道我的404文件夾有效。但是,我相信我要麼不以正確的方式使用路線,要麼無法設置兩個靜態文件夾。

您錯誤地嘗試使用express.static()來實現自定義404頁面。這不是它所做的。實現自定義404頁面的常用方法是鏈中最後一箇中間件處理程序。當它被擊中時,沒有其他人發現與當前請求匹配,因此您發送自定義404頁面。

這通常是這樣的:

app.use(function(req, res, next) { 
    res.status(404).sendFile(localPathToYour404Page); 
}); 

請參見本Express starter FAQ的「如何處理404迴應」一節。

而且,這裏是一個article on custom error pages,它顯示了一些其他的例子。

+0

而且應該得到最佳答案。但希望沒有人看到這個可恥的問題。哈哈! – DeadSupra

0

https://github.com/jekku/users/blob/master/server.js#L41

這裏有一個ExpressJS應用程序如何我路線我的靜態文件。我通常不會在路線上這樣做,但我認爲這是一個「初始化」過程。可以使用任何中間件兩次甚至更多 - 儘可能多地使用,牢記這一點。