我在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
,那么在转到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();
}
}
})
};
答案 0 :(得分:3)
您可以为此编写一个简单的中间件函数:
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
处理程序。
答案 1 :(得分:1)
假设您使用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" });
}
});
答案 2 :(得分:1)
检查(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();
}
}