2013-10-01 69 views
3

我需要在簡單的node.js中使用中間件的以下express.js代碼的等效代碼。我需要根據url進行一些檢查,並希望在自定義中間件中進行檢查。與url模式匹配的Node.js

app.get "/api/users/:username", (req,res) -> 
    req.params.username 

我有下面的代碼到目前爲止,

app.use (req,res,next)-> 
    if url.parse(req.url,true).pathname is '/api/users/:username' #this wont be true as in the link there will be a actual username not ":username" 
    #my custom check that I want to apply 

回答

3

一招是使用這樣的:

app.all '/api/users/:username', (req, res, next) -> 
    // your custom code here 
    next(); 

// followed by any other routes with the same patterns 
app.get '/api/users/:username', (req,res) -> 
    ... 

如果你只想匹配GET請求,使用app.get代替app.all

或者,如果你只是想使用某些特定路線的中間件,你可以使用這個(在JS這個時間):

var mySpecialMiddleware = function(req, res, next) { 
    // your check 
    next(); 
}; 

app.get('/api/users/:username', mySpecialMiddleware, function(req, res) { 
    ... 
}); 

編輯另一種解決方案:

var mySpecialRoute = new express.Route('', '/api/users/:username'); 

app.use(function(req, res, next) { 
    if (mySpecialRoute.match(req.path)) { 
    // request matches your special route pattern 
    } 
    next(); 
}); 

但我不明白這是如何使用app.all()作爲「中間件」的。

+0

我沒有中間件裏面App對象。另外我只想匹配URL模式。 –

+0

@AtaurRehmanAsad第一個解決方案匹配URL模式 – robertklep

+0

是的先生。但我沒有中間件的應用程序對象:) –

1

只需使用請求和響應對象就像在中間件的路由處理程序中一樣,但如果實際上希望請求在中間件堆棧中繼續,則調用next()

app.use(function(req, res, next) { 
    if (req.path === '/path') { 
    // pass the request to routes 
    return next(); 
    } 

    // you can redirect the request 
    res.redirect('/other/page'); 

    // or change the route handler 
    req.url = '/new/path'; 
    req.originalUrl // this stays the same even if URL is changed 
}); 
+0

我需要匹配這種模式「/ api/users /:username」,我不能用簡單的比較來做到這一點。 –

+0

你可以在'req.path'上使用'.split()'並檢查是否有url [1] ==='api'',url [2] ==='users''等。 – hexacyanide

+1

Yes I可以做到這一點。我只是想知道是否有一些標準的做法。任何節點庫等感謝迄今的幫助。 –

1

您可以使用節點JS url-pattern模塊。

製作模式:針對URL路徑

var pattern = new UrlPattern('/stack/post(/:postId)'); 

匹配模式:

pattern.match('/stack/post/22'); //{postId:'22'} 
pattern.match('/stack/post/abc'); //{postId:'abc'} 
pattern.match('/stack/post'); //{} 
pattern.match('/stack/stack'); //null 

欲瞭解更多信息,請參見:https://www.npmjs.com/package/url-pattern