2017-05-02 84 views
0

我正在構建一個節點js應用程序,需要爲除/video路線以外的所有路線返回一個404頁面。快遞js,如何匹配所有路線,甚至子路線

app.get('/video/*', Video.show) 
app.get('*', (req,res) => res.render('not_found')) 

這適用於URL沒有子目錄的情況。 當有人輸入具有子目錄(例如/hello/subhello/)的URL時,就會出現問題。這不是我的路線。

我已經嘗試過這些選項沒有成功:

app.get('/*', (req,res) => res.render('not_found')) 
app.use((req,res) => res.render('not_found')) 

我這麼想嗎?

由於

EDIT

當我刪除代碼來設置車把如預期的路由得到遵守。

這是車把設置代碼:

app.engine('.hbs', exphbs({ 
    extname:'.hbs', 
    defaultLayout:'layout.hbs', 
    layoutsDir: __dirname+ '/views' 
    })) 
    app.set('view engine', '.hbs') 
    app.set('views', __dirname + '/views') 
+1

如果你不知道你在找什麼,你將不得不執行'app.use()'。然後你可以使用'req.url'或者它的一些部分來創建自己的邏輯。 'req.method'會告訴你它是否是'GET','POST'等。 –

+0

我已經試過了。它仍然沒有抓住它。即使我只是說'app.use((req,res)=> res.redirect('not_found'))' –

+1

如果你把控制檯登錄到那個函數中,你是否曾經去過那裏?如果沒有,你必須在它到達之前重定向或響應。另外,'not_found'是你擁有的視圖的名字嗎?你有什麼錯誤嗎? –

回答

0

這裏有一個工作演示:

var express = require('express'); 
var app = express(); 
var exphbs = require('express-handlebars'); 

app.engine('.hbs', exphbs({ 
    extname:'.hbs', 
    defaultLayout:'layout.hbs', 
    layoutsDir: __dirname+ '/views' 
})) 

app.set('view engine', '.hbs') 
app.set('views', __dirname + '/views') 

app.get(['/videos', '/videos/*'], function (req, res) { 
    res.send('Hello World!'); 
}); 

app.use(function(req, res) { 
    res.status(404).send('Not found') 
}) 

app.listen(1233, function() { 
    console.log('Example app listening on port 1233!'); 
}); 

無論您訪問本地主機:1233 /視頻本地主機:1233 /視頻/ *你將得到一個Hello World響應。如果你去別的地方,你找不到。

編輯: 添加句柄代碼,與您的相同。仍按預期工作。

+0

謝謝!我做了一個類似的演示,它工作正常。我猜測這是導致此問題的其他設置的句柄 –

+0

這對於您放置中間件的順序非常重要。在這個演示中很明顯,但在較大的應用程序中可能會很麻煩。 – yBrodsky

+0

好吧,如果我刪除代碼來設置句柄一切都按預期工作。我會編輯我的問題,以反映 –