【问题标题】:how to allow pass through in express handlers?如何允许通过快递处理程序?
【发布时间】:2019-01-25 21:47:38
【问题描述】:

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 我不明白...你为什么不能把代码放在那个函数里?为什么同一路径/方法有另一条路线?
  • 您只想在年龄标准匹配时执行您的处理程序?
  • @AbhaySehgal 是的
  • 所以,如果它满足 call next,你可以使用中间件并将你的年龄条件放入该中间件中
  • @jakerella 它是一个复杂的设置,url 就像 a/b/c 并且有 a/* 的处理程序,我必须拦截 a/b/c 类型的 url,其他请求应该去a/* ,所以只是做了一个简单的例子来说明我的问题

标签: javascript node.js express routes middleware


【解决方案1】:

首先,这听起来是一个非常糟糕的设计,因此修复问题的更好方法是修复 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();
    }
})

【讨论】:

  • 知道为什么 app.use 不起作用而 app.post 起作用吗?
  • @ashishsingh - 我必须查看您的代码的整体布局,并且我必须更多地了解“不起作用”的含义。 app.use()app.post() 几乎相同,只是它可以查看所有类型的请求,而不仅仅是 POST 请求。但是,如果您只想查看 POST 请求,您应该使用app.post(),即使是更像中间件的东西。
  • 让我试试.. app.post 确实解决了我的问题,谢谢.. 不知道 app.METHOD 可以访问下一个,这也是我尝试使用 app.use 的原因,但它不起作用
【解决方案2】:

我处理这个问题的方法是,如果我有一条可行的路线,并且我需要其他东西,我会添加另一条类似的路线。这样,您就可以不理会原件——它提供了一项工作服务。这就是我想你所描述的。

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

  $.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'
                    });
                }
            });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多