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

我有我的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

现在我想添加一个filter来捕获所有的POST请求,并进行一些validation,并且只有满足这些条件时POST才会进入它的处理程序。

即如果我得到一个/users/adduser与POST请求,在去users.jspath文件夹中的方法之前,我应该能够捕获该请求,并停止它,如果条件不满足。

更新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) { ... }); 

在最后一种情况下,您不必检查validation器中间件中的req.method ,因为它只限于POST处理程序。

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

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

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

检查(userdata)运行asycn,所以你应该使用callback在这里: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(); } }