【问题标题】:Before filter for all post requests in node.js在过滤 node.js 中的所有发布请求之前
【发布时间】:2015-07-31 16:06:57
【问题描述】:

我的 node.js app.js 中有以下代码:

var express = require('express')
    ,cors = require('cors')
    ,app=express();
    var users = require('./routes/users');
    //some other codes
    .....
    app.use('/', routes);
    app.use('/users', users );

如果向/users/adduser 发出请求,它将转到路由文件夹中的users.js

现在我想添加一个过滤器,它将捕获所有 POST 请求并进行一些验证,并且只有在满足条件时,POST 才应该转到其处理程序。

即,如果我收到带有 POST 请求的 /users/adduser,在转到路由文件夹中 users.js 中的方法之前,我应该能够捕获该请求并在不满足条件时停止它。

更新 1 现在我有了这个 app.use 函数,但结果我得到了未定义,因为它没有等到函数返回值

app.use(function (req, res, next) {
    req.db = db;
    if (req.method != "POST") {
        next();
    }
    else {
        var userData = req.body;
        var result = Check(userData);
        if(result){
        next();            
        }
    }
});

function Check(userdata) { 

    var url = "someurl"+userdata.Id;

    var request = require("request");
    request({
        url: url,
        json: true
    }, function (error, response, body) {

        if (!error && response.statusCode === 200) {
            if (response.toJSON().body.id == userId) { 
                return true;
                // i also tried next();
            }  
        }
    })
};

【问题讨论】:

  • 你使用快递吗?绝对不清楚app是什么
  • 您应该检查哪种情况?
  • @simon 谢谢编辑了问题是的,我正在使用快递
  • @Edgar 我在发帖前检查权限和内容
  • 使用中间件会有帮助。

标签: javascript node.js express


【解决方案1】:

您可以为此编写一个简单的中间件函数:

var validator = function(req, res, next) {
  // If the request wasn't a POST request, pass along to the next handler immediately.
  if (req.method !== 'POST') return next();

  // Perform your validations.
  Check(req.body, function(err) {
    // Validation failed, or an error occurred during the external request.
    if (err) return res.sendStatus(400);
    // Validation passed.
    return next();
  });
};

function Check(userdata, callback) { 
  var url     = "someurl"+userdata.Id;
  var request = require("request");
  request({ url: url, json: true }, function(error, response, body) {
    if (!error && response.statusCode === 200) {
      if (response.toJSON().body.id === userId) { 
        return callback(null, true);
      }
    }
    return callback(new Error());
  })
};

您可以在多个点插入此中间件,具体取决于您的应用的结构。

一个选项:

app.use('/users', validator, users);

或者,如果您有一个单独的路由器用于/users(在./routes/users.js):

router.use(validator);

或者,如果您有单独的POST 路由用于/users/adduser

router.post('/adduser', validator, function(req, res) { ... });

在最后一种情况下,您不必在验证器中间件中检查 req.method,因为它无论如何都仅限于 POST 处理程序。

【讨论】:

  • 谢谢@robertklep 请检查我的其他问题stackoverflow.com/questions/31701893/…
  • 我正在向服务器发出请求以检查用户是否被授权,但在返回数据之前它会进入下一步,因为 javascript 异步运行
  • @vignesh 您需要在异步请求完成后调用next()(或res.sendStatus())。
  • 谢谢,我已经用代码更新了我的问题,请检查。不确定在哪里调用 next()
  • @vignesh 我编辑了我的答案以合并您的Check() 函数。
【解决方案2】:

假设您使用 Express,您可以使用路由中间件。

如果您想对所有POST/users 的请求执行验证,那么您可以在路由处理程序之前添加以下中间件:

router.use(function (req, res, next) {
  if (your request is valid){
      next();
  } else {
      //Return a response immediately
      res.status(400).json({ message: "Bad request" });
  }

});

【讨论】:

    【解决方案3】:

    Check(userdata) 运行 asycn 所以你应该在这里使用回调:D

    function Check(userdata,cb) { 
    
        var url = "someurl"+userdata.Id;
    
        var request = require("request");
        request({
            url: url,
            json: true
        }, function (error, response, body) {
    
            if (!error && response.statusCode === 200) {
                if (response.toJSON().body.id == userId) { 
                   cb(null,true);
                }  
            }
        })
    };
    

    然后像这样改变中间件

        var result = Check(userData,function(err,result){
                if(result){
                    next();            
                }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2018-11-08
      相关资源
      最近更新 更多