Запрос поиска на стороне сервера Angular Datatables возвращает пустой объект

Проблема

Я использую разбивку на страницы и поиск на стороне сервера, разбивка на страницы работает нормально, но когда я ввожу какой-то текст в поле поиска, которое автоматически отправляет запрос на сервер, он немедленно возвращается с пустым объектом, но также приносит «recordsTotal» для работы разбивки на страницы. Это означает, что один запрос выполняется, а второй - НЕТ.

Тест API с помощью почтальона

Я тестировал API USING POSTMAN, и какую бы строку поиска я ни отправлял, она возвращает мне соответствующие результаты, но когда я отправляю ее через окно поиска (FRONT END), она просто не работает

введите здесь описание изображения

Вот мой код контроллера:

Я намеренно прокомментировал "fnCallback (records)", но я утешаю "console.log (result)" массив результатов, возвращенный из внутреннего 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);
    });
});

person Wcan    schedule 13.06.2016    source источник
comment
Несвязно, но все, где я вижу параметр входящего запроса, только что добавленный к SQL-запросу, вызывает у меня мурашки по спине. Вы на 100% уверены, что ваш код не открыт для SQL-инъекций?   -  person ippi    schedule 13.06.2016
comment
Я знаю, что он открыт для SQL-инъекций, я намеренно заменил его? с прямыми переменными параметров, я исправлю, что как только он начнет работать, я заменю этот материал на? но это сводит меня с ума, почему я получаю результат по одному запросу, а не по другому.   -  person Wcan    schedule 13.06.2016


Ответы (1)


Я выяснил проблему и упомянул ее здесь на тот случай, если кто-то столкнется с такой же проблемой в будущем.

в этой строке я думал, что присваиваю значение для поиска, где, как и в самом фактическом .value.

var search = aoData[5].value;

строка поиска связана с объектом .value, правильным будет

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

Теперь он работает абсолютно нормально.

person Wcan    schedule 18.06.2016