2016-11-23 20 views
1

もう一度、hoomans!検索クエリのNodeJSおよび入れ子関数

私はNodeJSでこの小さなWebアプリケーションを使用しています。私は私のウェブページにいくつかの検索機能を持っています。しかし、この検索機能に関してネストされた機能について何か質問したいと思います。

私のコードには実際にエラーはありません。今はかなりうまく動いていますが、私がこれを求めているのは私のアルゴリズムを信頼していないからです。

元々、検索クエリのバックエンド部分では、データベースへの検索クエリを含むコードブロック全体が、routes/grades.js内のapp.post()メソッド内に書き込まれますファイル。一方、フロントエンドはAngularJSに別ファイルとしてpublic/javascriptsディレクトリに書かれています。これは、送信ボタンを使用して要求時に動的にテーブル要素をリロードする必要があります。

私は、複数のユーザーがapp.post()メソッドにアクセスし、私が知らない何らかの問題を引き起こす可能性があるシナリオを考えているので、これはアルゴリズム的な概念ではないと思います。

これで、コールバックとタイムアウトでネストされた関数を使用できるかどうかを考えています。私はので、私はちょうどにコードを貼り付けます明確にもうこれを記述することはできません、私のルートで

オリジナルコード:

ルート/ grades.js今

app.post('/grades', function(req, res, next){ 
    setTimeout(callback, 100); 
    try{ 
     var reqObj = req.body; 
     console.log("Request Object: " + reqObj["className"]); 
     req.getConnection(function(err, conn){ 
      if(err){ 
       console.error('SQL Connection error: ', err); 
       return next(err); 
      } 
      else{ 
       var insertSql = "SELECT Class_Name,Class_Code,Class_Instructor FROM classes WHERE Class_Name LIKE ?"; 
       var insertValues = [ 
        '%' + reqObj["className"] + '%' 
       ]; 
       var query = conn.query(insertSql, insertValues, function(err, result){ 
        if(err){ 
         console.error('SQL error: ', err); 
         return next(err); 
        } 
        var class_array = []; 
        for(var i=0; i<result.length; i++){ 
         class_array.push(result[i]); 
        } 
        console.log(class_array.valueOf()); 
        res.send([{ 
         info: 
          class_array.valueOf() 
        }]) 
       }); 
      } 
     }); 
    } 
    catch(ex){ 
     console.err("Internal error: " + ex); 
     return next(ex); 
    } 
}); 

を、Iを上記のroutes/grades.jsのコードを改訂し、それをより意味のあるものにしました(私は笑っています)。しかし、私はまだ、これらのコードのどちらがより良いアルゴリズムを持っているのか、どちらがうまくいくのかを知りたい。笑

ルート/ grades.js

router.post('/grades', function(req, res, next){ 
    searchForClass(req, res, next, function(){ 
     console.log("Class Search Success"); 
    }); 
}); 

function searchForClass(req, res, next, callback){ 
    setTimeout(callback, 100); 
    try{ 
     var reqObj = req.body; 
     console.log("Request Object: " + reqObj["className"]); 
     req.getConnection(function(err, conn){ 
      if(err){ 
       console.error('SQL Connection error: ', err); 
       return next(err); 
      } 
      else{ 
       var insertSql = "SELECT Class_Name,Class_Code,Class_Instructor FROM classes WHERE Class_Name LIKE ?"; 
       var insertValues = [ 
        '%' + reqObj["className"] + '%' 
       ]; 
       var query = conn.query(insertSql, insertValues, function(err, result){ 
        if(err){ 
         console.error('SQL error: ', err); 
         return next(err); 
        } 
        var class_array = []; 
        for(var i=0; i<result.length; i++){ 
         class_array.push(result[i]); 
        } 
        console.log(class_array.valueOf()); 
        res.send([{ 
         info: 
          class_array.valueOf() 
        }]) 
       }); 
      } 
     }); 
    } 
    catch(ex){ 
     console.err("Internal error: " + ex); 
     return next(ex); 
    } 
}; 

一方、これは、検索のための私のフロントエンドコードです。

公開/ JavaScriptの/

$scope.classFun = function(){ 
     console.log('clicked submit'); 
     $http({ 
      url: 'http://localhost:3000/grades', 
      method: 'POST', 
      data: $scope.data 
     }).then(function (httpResponse){ 
      console.log('response', httpResponse); 
      // console.log(Object.keys(httpResponse.data[0].info[0]).length); 
      var tbody = document.getElementById("class_list_data"); 
      while(tbody.firstElementChild){ 
       tbody.removeChild(tbody.firstChild); 
      } 
      for(var i=0; i<httpResponse.data.length; i++){ 
       for(var j=0; j<httpResponse.data[i].info.length; j++){ 
        var tr = document.createElement("tr"); 
        var td = document.createElement("td"); 
        td.appendChild(document.createTextNode(httpResponse.data[i].info[j].Class_Name.toString())); 
        tr.appendChild(td); 
        tbody.appendChild(tr); 
       } 
      } 
     }) 
    } 

をapp.js私は正しく私の問題を表現願っていますし、私は本当にあなたたちは私を助けることができると思います。

多くの感謝!

+0

*コードレビュー*にご質問を投稿してください。 –

答えて

0

コードに問題が1つしかないので、コールバック関数が必要ないとは思いません。なぜなら、それは意味がないからです。

setTimeout(callback, 100); //it fires the callback after 100ms no matter what 

各リクエストは異なるスコープで実行されるため、複数のクライアントリクエストを心配する必要はありません。

"LIKE"キーワードでMySQL文字列検索を使用すると、テーブルが大きくなり、インデックスが正しく作成されない場合、パフォーマンスが向上します。

+0

オーケー。つまり、元のコードはうまく動作しますか? – Michael

+0

基本的には同じです。 – iKoala

+0

わかりました。私はnodeJSのこの複数のリクエストについて読んだので、このアルゴリズムに当てはまると思った...とにかく、ありがとう。結局私の元のコードに何も間違っていたことは今知っています。 (あなたが言及した "LIKE"キーとは別に)。私はそれで解決します。ありがとう!乾杯! – Michael

関連する問題