如何允许快递处理程序通过?

how to allow pass through in express handlers?

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

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

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

现在在快递中我有像

这样的路线
app.post('/users', function(r,res){
  // function body
})

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

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

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

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

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

首先,这听起来像是一个非常糟糕的设计,所以真正解决问题的更好方法是只修复 URL 设计,这样您就不会在可以和不能的代码之间产生这种冲突调整。我这样说是因为听起来您正试图 "hack" 做一些事情而不是进行适当的设计。

如果您的代码使用常规的主体解析器中间件,那么 post 的主体将已经被解析并在 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();
    }
})

我处理这个问题的方法是,如果我有一条可行的路线,而我需要其他东西,我会添加另一条类似的路线。通过这种方式,您可以不理会原件 - 它提供了有效的服务。这就是我认为您正在描述的内容。

您可以随意调用路由。如果你想要一个用户列表,你可以像这样传递一个变量:

  $.get('/contactCard/'+qry);

  app.get('/contactCard/:sort', function(req, res) {
       var cId = req.params.sort;
       console.log('cId: ' + cId);

然后设置搜索查询并像这样获取数据:

     let params = {
                TableName: ddbTable,
                ProjectionExpression : "cEmail,Forename,Surname",
                KeyConditionExpression: "ID = :e ",
                ExpressionAttributeValues: {
                    ":e" : cId
                }
            };
     console.log("params", JSON.stringify(params, null, 2));
     docClient.query(params, function(err, data) {

然后你检查错误或成功:

                if (err) {
                    console.log("Error:", JSON.stringify(err, null, 2));
                } else {
                    console.log("Success", JSON.stringify(data, null, 2));
                    let contacts = data;

然后在此处呈现您想要的页面并按您的意愿传递数据。

                    res.render('members/contactcard', {  
                                contacts:contacts,
                                static_path: '/static'
                    });
                }
            });