空のオブジェクトを返している問題角度のDataTableサーバー側の検索要求は、
私は、サーバー側のページ付けと検索を使用しています私は、自動的にサーバに要求を送信し、検索ボックスにテキストを入力すると、改ページは、正常に動作しているが、それはすぐに空のオブジェクトで返されますが、ページネーションの "recordsTotal"も機能します。つまり、1つのクエリが実行されていますが、2つ目のクエリは実行されていません
APIテスト私がPOSTMAN、これまで私が送った文字列を検索を使用してAPIをテストしてみた
使用して郵便配達は、それが戻って適切な結果を私にもたらしますが、私は(先端から)検索ボックスを介してそれを送信するときそれは単にここで
を動作しません、私のコントローラコードです:
私は意図的に「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);
});
});
無関係ですが、SQLクエリに追加された受信リクエストパラメータだけが私の背骨の寒さをもたらします。あなたのコードがSQLインジェクションに開かれていないことを100%確信していますか? – ippi
私はそれがSQLインジェクションにオープンであることを知っています。私は意図的に "?"直接パラメータ変数を使用して作業を開始すると、そのものを "?"しかし、これはなぜ私が1つのクエリの結果を受け取っているのか、他のクエリの結果を受け取っていないのかを知っている。 – Wcan