2017-05-14 11 views
1

私は現在、ExpressとMongoDbを使ってAPIアプリケーションを構築しています。 JavaScriptの新機能です。クリーナーでDRYerの方法でこれを書く上の任意の提案?これをDRY形式で書き直す手助けが必要

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

、これは動作するコードである場合は、この質問はおそらくhttp://codereview.stackexchange.comに属します。 – jfriend00

答えて

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)ifブロックで異なるように思えるような場合に

、HTTPを返す400

+0

ありがとうございました!コードを書く方法についてもう少し説明してもらえますか? :) – vanegeek

+0

私はコードを追加しました。 – arboreal84

2

唯一のことは、あなたがInstructor.findに渡すことを最初のパラメータ(もしあれば)です。

ifステートメントのみを使用して最初のパラメータを決定し、Instructor.findを適切なパラメータで1回だけ呼び出すことができます。ここで

は一例です:

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); 
+0

これは完全に機能しました!ありがとうございました! – vanegeek

関連する問題