【问题标题】:Global search is not working in DataTable when server side is enabed in NodeJs在 Node Js 中启用服务器端时,全局搜索在 DataTable 中不起作用
【发布时间】:2019-01-28 05:34:38
【问题描述】:

我正在尝试从 MongoDB 服务器获取表单数据并使用 nodeJs 将其显示到数据表中。我使用 npm Paginate v-2 插件成功完成了服务器端分页。但现在搜索不起作用。下面是我的 NodeJs 和 javascript 文件代码。请帮我搜索。

NodeJs 代码

app.get('/gettable',(req,res)=>{
    console.log(req.query);
    user.paginate({},{
        page:Math.ceil(req.query.start / req.query.length) + 1,
        limit:parseInt(req.query.length)

    },function(err,result){
        var mytable = {
            draw:req.query.draw,
            recordsTotal:0,
            recordsFiltered:0,
            data:[],

        }
        if(err) {
            console.log(err);
            res.json(mytable);
        } else {
            if(result.totalDocs > 0) {
                mytable.recordsTotal = result.totalDocs;
                mytable.recordsFiltered = result.totalDocs;

                for(var key in result.docs) {
                    mytable.data.push([
                        result.docs[key]['name'],
                        result.docs[key]['lastname'],
                        result.docs[key]['email'],
                        result.docs[key]['pass'],
                        result.docs[key]['birthdate'],
                        result.docs[key]['zipcode'],
                        result.docs[key]['phonenumber'],
                    ]);
                }
            }
            res.json(mytable);
        }

 });

DisplayTable.Js 代码

$(document).ready(function(){
   $('#example').DataTable({
      "processing": true,
      "serverSide": true,
      "ajax": "http://localhost:8080/gettable"
   });
})

正如我所说,我成功地从服务器获取数据并通过服务器端分页显示到数据表中,但搜索不起作用,但在搜索 div 时,无论我搜索什么,我都会在搜索数组中获得该值,如下所示

search: { value: 'svs', regex: 'false' },
  _: '1548653540009' }

但它没有在数据表中实现过滤列。

【问题讨论】:

  • 您的意思是您正在通过查询 (req.query) 搜索您的数据库并且它不起作用(即您没有返回搜索结果)或者您的数据库以正确的方式响应数据并将其加载到 HTML 中,但您无法搜索此数据?是哪一个?
  • @EmmanuelNK 我正在从服务器获取数据并将其放入数据表中,但 Datatables 默认搜索栏不起作用。我正在使用 Bootstrap 4 使用默认数据表
  • @Arjun,仅启用服务器端,全局搜索将无法开箱即用。您必须在节点 js 中添加该代码以进行搜索,然后将响应发送回数据表
  • 好的@PrashantPokhriyal 我明白了。你能帮我看看如何在nodeJS中做到这一点。
  • @Arjun,真的很抱歉,我不是 nodejs 人。无论如何,我会尽力为您提供解决方案

标签: node.js mongoose datatables datatables-1.10


【解决方案1】:

正如我在comment 中所说,当在 DataTable 中启用服务器端时,搜索不会开箱即用,这是因为现在整个功能,无论是排序、分页、限制和搜索都必须在服务器。 DataTable 只会发送执行该功能所需的参数。以下代码仅供参考,未经测试,您也可能会遇到错误。您可以从以下代码中获得输入。如果出现错误,请随时编辑以下代码,以便对以后的读者有所帮助。

app.get('/gettable',(req,res)=>{
    console.log(req.query);

    var query = {},

       // array of columns that you want to show in table
       columns = ['name', 'lastname', 'email', 'pass', 'birthdate', 'zipcode', 'phonenumber',];

    // check if global search is enabled and it's value is defined
    if (typeof req.query.search !== 'undefined' && req.query.search.value != '') {

        // get global search value
        var text = req.query.search.value;

        // iterate over each field definition to check whether search is enabled
        // for that particular column or not. You can set search enable/disable
        // in datatable initialization.
        for (var i=0; i<req.query.columns.length; i++) {
            requestColumn = req.query.columns[i];
            column = columns[requestColumn.data];

            // if search is enabled for that particular field then create query
            if (requestColumn.searchable == 'true') {
                query[column] = {
                    $regex: text,
                };
            }
        }
    }

    user.paginate(query,{
        page:Math.ceil(req.query.start / req.query.length) + 1,
        limit:parseInt(req.query.length)

    },function(err,result){
        var mytable = {
            draw:req.query.draw,
            recordsTotal:0,
            recordsFiltered:0,
            data:[],

        }
        if(err) {
            console.log(err);
            res.json(mytable);
        } else {
            if(result.totalDocs > 0) {
                mytable.recordsTotal = result.totalDocs;
                mytable.recordsFiltered = result.totalDocs;

                for(var key in result.docs) {
                    var data = [];
                    for(var column in columns) {
                        data.push(result.docs[key][column]);
                    }
                    mytable.data.push(data);
                }
            }
            res.json(mytable);
        }

 });

【讨论】:

  • 感谢 Prashant 的帮助,这个逻辑不起作用 var text 没有得到任何东西,我认为有问题。
  • 我在用户内部编写了您的代码。在 for 循环之后分页,现在我在控制台中获得了我在搜索栏中写入的值,这意味着我们的 var 文本是完美的,但进一步的逻辑可能不正确。
  • 它还没有工作 Prashant,在控制台中该列只给出数字,就像我有 7 列一样,所以在控制台中它打印 0 然后在新行 1 中,然后从 2 到 7 但它没有打印任何数据
  • 好的,当我写console.log(query[column])时,它的打印列值为0 { '$regex': 'dvd' } ,column value is1 { '$regex': 'dvd' }...直到第 7 列。所以这意味着我们在正则表达式中获得了价值,但表中没有任何变化。
  • 我已经更新了我的答案@Arjun,您现在可以利用列数组在您的 for 循环中生成数据
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 2018-12-23
  • 1970-01-01
  • 2020-09-02
  • 2021-12-19
  • 2020-12-01
  • 2019-03-04
  • 1970-01-01
相关资源
最近更新 更多