在NodeJS中使用带有大量数据的Datatable时搜索错误

时间:2017-09-06 12:09:04

标签: node.js mongodb datatable datatables

我的数据库中有大约5,00,000条记录。我使用DataTables构建管理面板来管理记录。 我将Node.js作为MongoDB的支持。

我使用过此库 - https://www.npmjs.com/package/datatables-query

到目前为止,在页面加载时我已成功加载结果,如下图所示。

enter image description here

每当我在搜索框中输入内容时,我都会收到500错误,如屏幕截图所示。

enter image description here

这可能是什么问题?

DataTable是显示包含大量数据的网格的好选择,还是考虑Node.js,Express和MongoDB组合有更好的选择?

这是我的服务器端代码。

app.post('/getUsersData',function(req, res) {
  var Model = require('./models/user'),
    datatablesQuery = require('datatables-query'),
    params = req.body,
    query = datatablesQuery(Model);

  query.run(params).then(function (users) {
    var data = JSON.stringify(users);
    // var data = JSON.stringify(users);

    res.end(data);
  }, function (err) {
    res.status(500).json(err);
  });
});

我在MongoDB中有一个名为User with 3 columns

的表

1)姓名

2)电子邮件

3)密码

$(document).ready(function() {
  var table = $('#datatable').DataTable({
    // dom: 'Bfrtip',
    processing: true,
    serverSide: true,
    order: [[1, 'asc']],
    "aoColumnDefs": [ { "sClass": "hide_me", "aTargets": [ 0 ], visible: false } ], // first column in visible columns array gets class "hide_me"
    ajax: {
        url: "/getUsersData",
        type: 'POST',
        dataSrc: "data"
    },
    columns: [
        { data : "_id"},
        { data : "name" },
        { data : "email" },
        { data : "password" },
   ],
   responsive: true
  });
});

3 个答案:

答案 0 :(得分:4)

我可能会在数据上创建索引并搜索该索引而不是搜索数据本身。但是,如果你创建了一个全文索引,你需要将你的集合中所有cols和mongo allows only 1 full text index per collection组合起来。

至于替代方案,您可以查看AWS的弹性搜索(适用于MongoDB)或Sphinx索引(基于PostreSQL)

编辑: 我知道这个答案实际上并没有回答这个问题 我担心500错误不是应用程序中的内存问题,而是数据库(mongo不像SQL,因此不要像在SQL中那样设计应用程序)。

一些阅读材料,如果您打算更改数据库结构

http://rachbelaid.com/postgres-full-text-search-is-good-enough/
https://about.gitlab.com/2016/03/18/fast-search-using-postgresql-trigram-indexes/

答案 1 :(得分:1)

这里的关键是弄清楚DB或服务器端层究竟出了什么问题。您发出警告的错误消息是来自数据表库的一般消息,它指向以下文档:https://datatables.net/manual/tech-notes/7

上面链接的文档说,只要从服务器返回非200响应,就会发生此错误。在这种情况下,您明确地在数据表查询调用的错误处理程序/回调中抛出了500错误,但这并没有为您提供我们所需的信息!

下一步是在浏览器控制台的网络选项卡中查看响应正文,因为您将错误序列化为json并将其与500响应一起发送,或者console.log发出err {{1}} 1}}在节点代码中的错误处理程序/回调中。这将使您了解实际出现的问题,通过这些信息,我们可以更准确地规定解决方案。发布更新时请注明您的任何内容!

答案 2 :(得分:0)

这是我试图解决此问题的解决方案: 转到jquery.datatable.min.js,然后注释掉错误消息,您就可以开始了。

function K(a, b, c, d) {
        // c = "DataTables warning: " + (a ? "table id=" + a.sTableId + " - " : "") + c;
        // d && (c += ". For more information about this error, please see http://datatables.net/tn/" + d);
        // if (b) E.console && console.log && console.log(c); else if (b = n.ext, b = b.sErrMode || b.errMode, a && r(a, null, "error", [a, d, c]), "alert" == b) alert(c); else {
        //     if ("throw" == b) throw Error(c);
        //     "function" ==
        //     typeof b && b(a, d, c)
        // }
    }