Problem
I'm using server side pagination and search, pagination is working fine but when i enter some text into search box which automatically sends request to server, it immediately returns back with empty object but its also bringing "recordsTotal" for pagination to work. which means one query is executing but the second one is NOT.
API Test using postman
I've tested the API USING POSTMAN and what ever search string i send, it brings me back the appropriate results but when i send it via search box (FROM FRONT END) it just simply won't work
Here is my Controller Code:
I've intentionally commented "fnCallback(records)" but I'm consoling "console.log(result)" the result array returned from back-end 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);
});
}
});
Here is Code for filterService factory:
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;
}
};
Back-end Code:
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);
});
});