2014-01-21 28 views
20

我想根据请求查询参数来决定使用哪个中间件。根据请求有条件地使用中间件参数express

在主模块中

我有这样的事情:

app.use(function(req, res){ 
    if (req.query.something) { 
    // pass req, res to middleware_a 
    } else { 
    // pass req, res to middleware_b 
    } 
}); 

middleware_amiddleware_b既表达应用自己被express()函数创建的,而不是常规的中间件功能(function(req, res, next)

不能找到办法做到这一点

+0

你的代码有什么问题?作为一个明确的维护者,这是我建议你这样做的。 –

+0

@JonathanOng问题是'middleware_a'和'middleware_b'是'express()'创建的对象,而不是普通的中间件函数,所以我不能真正将req,res放在他们旁边...... – Michael

+1

express apps本身就是中间件。是的你可以。 –

回答

7

我不会使用中间件 - 而是在中间件A和B检查whatev ER:

//Middleware A 
app.use(function(req, res){ 

    // If it doesn't match our condition then send to next middleware 
    if (!req.query.something) { 
    next(); 
    } else { 
    // We're good - let this middleware do it's thing 
    ... 
    next(); 
    } 
}); 

同样的,中间件乙

//Middleware B 
app.use(function(req, res){ 

    if (req.query.something) { 
    ... 
}); 
1

看起来你可能缺少的伎俩。 每件中间件都是一个请求处理程序。首先查看第一个请求处理程序,然后查看下一个请求处理程序,然后再查看下一个处理程序,依此类推。

这里是中间件基本上看起来像:

function myFunMiddleware(request, response, next) { 
// Do stuff with the request and response. 
// When we're all done, call next() to defer to the next middleware. 
next(); 
} 

我建议你修改你的代码,这样的事情。

app.use(function(request, response, next) { 
    if (request.url == "/") { 
    response.writeHead(200, { "Content-Type": "text/plain" }); 
    response.end(".. Any custom msg..\n"); 
// The middleware stops here. 
    } 
    else { 
    next(); 
}}); 

请通过此tutorial来,我相信你会得到使用中间件的一个很好的概述。有一个快乐的编码。

16

连接/表达'中间件'没有什么神奇的:它们只是函数 - 你可以调用它们,就像调用任何其他函数一样。

所以在你的例子:

app.use(function(req, res, next){ 
    if (req.query.something) { 
    middlewareA(req, res, next); 
    } else { 
    middlewareB(req, res, next); 
    } 
}); 

这就是说,有可能构建分层Express应用程序的更优雅的方式。退房TJ's video

+0

多数民众赞成的事情。我的应用程序与TJ的视频相同。所以middleware_a和middleware_b实际上是对象而不是函数,所以我不能真正将“req,res,next”传递给它们。 Express知道区分这两者,并在将它们中的任何一个传递给中间件时处理它们两者。 – Michael

4

我知道这个问题很旧,但我想分享我的解决方案。我通过使用回调函数返回中间件来解决此问题。

例中间件:

function isAdminUser(callback){ 
    return function(req, res, next){ 
     var userId = callback(req); 
     // do something with the userID 
     next(); 
    } 
} 

然后,你可以做快递路由器对象

app.use(isAdminUser(function(res){ 
    return res.body.userId 
    }); 
+0

这是一种优雅的方式,我认为如果我没有找到更好的方法使用它 –

1

我知道我有点晚了这个线程,但你可以使用这个插件以下 Express Conditional Tree Middleware

它允许您组合多个和异步中间件。 具体来说,您可以创建两个代表您的中间件(middleware_a,middleware_b)的类以及将驻留在这些类中的applyMiddleware方法返回由您的中间件功能创建的承诺或自定义已解决的承诺以及来自中间件功能的结果再次。

然后,在您的主js文件中,您可以根据需要创建一个chainer,以有条件地组合这些中间件!查看文档以获取更多信息,在检查代码后它会更清晰。

+1

现在它看起来像一个正确的答案。我回顾了我的国旗并删除了我的(现在不相关的)评论。 – g00glen00b

+0

完美!感谢再次让我知道,我很新:) – DevForce