首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务器端搜索请求返回空对象

服务器端搜索请求返回空对象
EN

Stack Overflow用户
提问于 2016-06-13 14:17:24
回答 1查看 1.1K关注 0票数 2

问题

我正在使用服务器端分页和搜索,分页工作正常,但是当我在搜索框中输入一些自动发送请求到服务器的文本时,它会立即返回空对象,但它也会为分页工作带来"recordsTotal“。这意味着一个查询正在执行,而第二个查询没有执行。

基于邮递员的API测试

我已经使用POSTMAN测试了API,无论我发送什么搜索字符串,它都会给我带来适当的结果,但是当我通过搜索框(从前端)发送它时,它就是不能工作。

这里是我的控制器代码:

我有意评论“fnCallback(记录)”,但我正在安慰“console.log(结果)”--从后端API返回的结果数组。

代码语言:javascript
复制
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工厂的代码:

代码语言:javascript
复制
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;
        }
};

后端代码:

代码语言:javascript
复制
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);
    });
});
EN

回答 1

Stack Overflow用户

发布于 2016-06-18 01:57:50

我已经解决了这个问题,我在这里提到过,以防将来有人面临同样的问题。

在这一行上,我认为我是在分配值,以便搜索实际的.value本身。

代码语言:javascript
复制
var search = aoData[5].value;

搜索字符串与.value对象一起使用,正确的

代码语言:javascript
复制
var search = aoData[5].value.value;

现在它的工作非常好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37792100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档