4

我需要一个等价于可以在中间件中使用的简单 node.js 中的 express.js 代码。我需要根据 url 进行一些检查,并希望在自定义中间件中进行。

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
4

3 回答 3

5

一个技巧是使用这个:

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()比用作“中间件”更胜一筹。

于 2013-10-01T13:03:06.260 回答
3

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

制作图案:

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

匹配模式与 url 路径:

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

于 2016-03-10T09:36:49.357 回答
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
});
于 2013-10-01T13:04:43.920 回答