在过滤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(); } }