首页 > 解决方案 > 如何允许通过快递处理程序?

问题描述

我有一个POSTapi 端点可以/users用来获取用户列表。

这是POST因为请求的正文非常庞大,可能不适合GET请求的 url。

假设用户的主体POST有一个名为的键age,它应该给我一定年龄的用户,即一种过滤

现在在快递我有类似的路线

app.post('/users', function(r,res){
  // function body
})

而且我实际上不能在该函数体内放置任何代码

所以我能够通过使用另外一个处理程序/users并将其放在原始处理程序之前来拦截请求,但显然它拦截了所有/users请求并破坏了早期的功能

我怎样才能只拦截具有特定年龄的请求,然后将其他请求传递给原始处理程序,以便原始功能继续工作?

我想知道如何使用路由处理程序而不是中间件来做到这一点?

我也不能弄乱 url 或请求正文

标签: javascriptnode.jsexpressroutesmiddleware

解决方案


首先,这听起来像是一个非常糟糕的设计,因此修复问题的更好方法是修复 URL 设计,这样您就不会在可以修改和不能修改的代码之间发生冲突。我这样说是因为听起来您是在尝试“破解”某些东西,而不是做出正确的设计。

如果您的代码使用常规的正文解析器中间件,那么帖子的正文将已经被解析并在req.body. 因此,您可以在其中查找所需的参数req.body.age并检查其值。

如果它符合您的标准,那么您可以处理请求并完成。如果它不满足您的请求,那么您调用next()以继续处理其他请求处理程序。

// make sure this is defined BEFORE other /users request handlers
app.post('/users', function(req, res, next) {
    // test some condition here
    if (+req.body.age > 30) {
        // process the request and send a response
        res.send("You're too old");
    } else {
        // continue processing to other request handlers
        next();
    }
})

推荐阅读