2016-06-13 7 views
1

空のオブジェクトを返している問題角度のDataTableサーバー側の検索要求は、

私は、サーバー側のページ付けと検索を使用しています私は、自動的にサーバに要求を送信し、検索ボックスにテキストを入力すると、改ページは、正常に動作しているが、それはすぐに空のオブジェクトで返されますが、ページネーションの "recordsTotal"も機能します。つまり、1つのクエリが実行されていますが、2つ目のクエリは実行されていません

APIテスト私がPOSTMAN、これまで私が送った文字列を検索を使用してAPIをテストしてみた

使用して郵便配達は、それが戻って適切な結果を私にもたらしますが、私は(先端から)検索ボックスを介してそれを送信するときそれは単にここで

enter image description here

を動作しません、私のコントローラコードです:

私は意図的に「fnCallback(記録)」が、私は慰めてる「はconsole.log(結果)」をコメントしてきた結果の配列は、バックエンドAPIから返さ

ここ
angular.module('withServerSide', ['datatables']) 
.controller('withServerSideController', function WithPromiseController($scope, DTOptionsBuilder, DTColumnBuilder, filterService) 
{ 
    $scope.dtColumns = [ 
     DTColumnBuilder.newColumn('es_officer_id', 'Id').withOption('searchable', true), 
     DTColumnBuilder.newColumn('es_officer_name', 'Name').withOption('searchable', true) 
    ]; 

    $scope.dtOptions = DTOptionsBuilder 
     .newOptions() 
     .withFnServerData(serverData) 
     .withDataProp('data') // tried data aswell 
     .withOption('processing', true) 
     .withOption('serverSide', true) 
     .withOption('paging', true) 
     .withOption('stateSave', true) 
     .withOption('lengthMenu', [5, 10, 20, 30, 50, 100 ]) 
     .withDisplayLength(5) 
     .withPaginationType('full_numbers') 
     .withButtons([ 
      'colvis', 
      'print', 
      'excel' 
     ]) 

    function serverData(sSource, aoData, fnCallback, oSettings) 
    { 
     //All the parameters you need is in the aoData variable 

     var draw = aoData[0].value;    
     var limit = aoData[4].value;    // item per page 
     var order = aoData[2].value[0].dir; // order by asc or desc 
     var start = aoData[3].value;    // start from 
     var search = aoData[5].value;   // search string 

     //Then just call your service to get the records from server side 
     filterService.execute(start, limit, order, search).then(function(result) 
     {  
      console.log(result); 

      // var records = { 
      //   'draw': draw, 
      //   'recordsTotal': result.data.recordsTotal, 
      //   'recordsFiltered': result.data.recordsFiltered, 
      //   'data': result.data.es_officers 
      //  }; 

      // // console.log(records); 

      // fnCallback(records); 
     }); 
    } 
}); 

はfilterService工場のためのコードです:

angular.module('Main_Module').factory('filterService', filterService); 
filterService.$inject = ['$q', '$http'] 
function filterService($q, $http) 
{ 
    var service = { 
    execute: execute 
    }; 

    return service; 

     //    Start-From LIMIT ASC | DESC 
     function execute(start, limit, order, search) 
     { 
      // console.log(start, length, order); 

      var defered = $q.defer(); 
      //Make a request to backend api and then call defered.resolve(result); 

      // /SELECTSpecific/:TableName/:Start/:Length/:Order 
      $http({ 
       url : 'http://localhost:3000/api/SELECTQPromise/es_officers/'+start+'/'+limit+'/'+order+'/'+search, 
       method: 'POST' 
      }) 
      .then(function(result) 
      {      
       defered.resolve(result); 
      }) 
      .catch(function(err) 
      { 
       defered.reject(err); 
      }); 


      return defered.promise; 
     } 
}; 

バックエンドのコード:

router.post('/SELECTQPromise/:TableName/:start/:limit/:order/:search', function(req, res) 
{ 

    function doQuery1() 
    { 
     var query1 = "SELECT COUNT(*) AS recordsTotal FROM " + req.params.TableName; 

     var defered = Q.defer(); 
     connection.query(query1, function(err, result) //defered.makeNodeResolver() 
     { 
      if(err) 
      { 
       defered.reject(err); 
      } 
      else 
      { 
       defered.resolve(result[0]); 
      } 
     }); 

     return defered.promise; 
    } 


    function doQuery3() 
    { 
     var query3 = "SELECT es_officer_id, es_officer_name FROM "+req.params.TableName+ 
        " WHERE es_officer_name LIKE '%"+req.params.search+"%'"+ 
        " ORDER BY es_officer_id "+req.params.order;//+" LIMIT "+req.params.start+", "+req.params.limit; 

     var defered = Q.defer(); 
     connection.query(query3, function(err, result) //defered.makeNodeResolver()); 
     { 
      if(err) 
      { 
       defered.reject(err); 
      } 
      else 
      { 
       defered.resolve(result); 
      } 
     }); 

     return defered.promise; 
    } 


    Q.all([doQuery1(), doQuery3()]).then(function(result) 
    { 
     // res.json({"Error" : false, "Message" : "success", [req.params.TableName] : result[1], "recordsTotal": result[0].recordsTotal, "recordsFiltered": result[0].recordsTotal}); 
     res.send(result); 
    }) 
    .catch(function(err) 
    { 
     res.send(err); 
    }); 
}); 
+0

無関係ですが、SQLクエリに追加された受信リクエストパラメータだけが私の背骨の寒さをもたらします。あなたのコードがSQLインジェクションに開かれていないことを100%確信していますか? – ippi

+0

私はそれがSQLインジェクションにオープンであることを知っています。私は意図的に "?"直接パラメータ変数を使用して作業を開始すると、そのものを "?"しかし、これはなぜ私が1つのクエリの結果を受け取っているのか、他のクエリの結果を受け取っていないのかを知っている。 – Wcan

答えて

0

私はこの問題を考え出したと私はmentioneよ将来誰かが同じ問題に直面した場合に備えて、ここにdしてください。

私は実際の.value自体と同じように検索するために値を割り当てると思っていました。

var search = aoData[5].value; 

検索文字列が.VALUEオブジェクトであり、正確には

var search = aoData[5].value.value; 

その作業を絶対に大丈夫だと思います。

関連する問題