javascript - 在过滤 node.js 中的所有发布请求之前

标签 javascript node.js express

我的 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 发出请求,它将转到 routes 文件夹中的 users.js

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

即如果我得到一个带有 POST 请求的 /users/adduser,在转到 routes 文件夹中的 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();
            }  
        }
    })
};

最佳答案

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

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);

或者,如果您为 /users/adduser 设置了单独的 POST 路由:

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

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

关于javascript - 在过滤 node.js 中的所有发布请求之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31718100/

相关文章:

javascript - 是否可以在javascript中获取textarea最后一行的内容?

node.js - 在 Node-red 仪表板中显示普通图表或 D3J(通过模板?)

javascript - ExpressJS 为什么在 DELETE 方法之后调用我的 GET 方法?

node.js - 错误: Nest cannot export component/module that is not a part of the currently processed module (DatabaseModule)

javascript - 表达语法错误 : Unexpected token

javascript - 重新排列 javascript 对象

javascript - 根据浏览器窗口尺寸自动调整图像大小

java - Android 到 node.js 的通信

javascript - 如何仅在另一个函数完成后才执行另一个函数?

node.js - Cloud Functions for Firebase 数据库 onWrite 触发了两次