需要帮助以DRY格式重写此内容

时间:2017-05-14 02:32:49

标签: javascript mongodb express dry

我目前正在使用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);
        });
    }

2 个答案:

答案 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。