Node.js匹配url模式

时间:2013-10-01 12:50:59

标签: node.js express url-pattern

我需要在简单的node.js中使用以下express.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 个答案:

答案 0 :(得分:4)

一个技巧就是使用它:

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()作为'中间件'。

答案 1 :(得分:2)

只需像中间件的路由处理程序一样使用请求和响应对象,但如果您确实希望请求在中间件堆栈中继续,则调用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
});

答案 2 :(得分:2)

您可以使用node-js url-pattern 模块。

制作模式:

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