我目前正在使用Express和MongoDb构建API应用程序。 我是JavaScript的新手。有关以清洁和干燥的方式写这个的任何建议吗?
var firstName = req.query.firstName;
var students = req.query.students;
if(firstName){
Instructor.find({firstName: firstName},function(err,instructors){
if(err)
res.status(500).send(err);
else
res.json(instructors);
});
console.log("Instructor name is ", req.query.firstName);
}
else if(students){
Instructor.find({students: students},function(err,instructors){
if(err)
res.status(500).send(err);
else
res.json(instructors);
});
}
else{
Instructor.find(function(err,instructors){
if(err)
res.status(500).send(err);
else
res.json(instructors);
});
}
答案 0 :(得分:2)
if
块中唯一似乎不同的是您传递给Instructor.find
的第一个参数(如果有)。
您只能使用if
语句来确定第一个参数,并使用适当的参数调用Instructor.find
一次。
以下是一个例子:
var firstName = req.query.firstName;
var students = req.query.students;
var params = [];
var callback = function(err,instructors){
if(err)
res.status(500).send(err);
else
res.json(instructors);
};
if(firstName){
params.push({firstName: firstName});
} else if(students){
params.push({students: students});
}
params.push(callback);
Instructor.find.apply(Instructor, params);
答案 1 :(得分:1)
由于执行查询的部分和查询响应处理程序似乎相同。条件部分是查询构造。
var firstName = req.query.firstName;
var students = req.query.students;
var query = {};
if (firstName) {
req.query.firstName = firstName;
} else if (students) {
req.query.students = students;
} else {
return next(new Error('Invalid request'));
}
Instructor.find(query, function (err, results) {
if (err) {
// You should sanitize this error though
return res.status(500).send(err);
}
return res.json(results);
});
现在,在实践中,您应该考虑更多地验证查询参数。例如:_.isArray(req.query.students) && !_.isEmpty(req.query.students)
。然后,学生数组可以包含重复的键。例如:[1,1,1,1,1,1....
(1000次)。这可以用作拒绝服务。在使用之前尝试对ID数组_.uniq
。
对于字符串... _.isString(req.query.firstName) && _.isEmpty(req.query.firstName)
。
在这些情况下,请返回HTTP 400。