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

Posted

技术标签:

【中文标题】在NodeJS中使用带有大量数据的Datatable时搜索错误【英文标题】:Search error while using Datatable with huge data in NodeJS 【发布时间】:2018-02-14 22:09:08 【问题描述】:

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

我用过这个库 - https://www.npmjs.com/package/datatables-query

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

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

这可能是什么问题?

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 的表,包含 3 列

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
  );
);

【问题讨论】:

如果您有特定的列(可能还有关系数据),为什么选择 MongoDb ? (不是批评,只是好奇) 在大部分教程中学习 NodeJS 时,导师都在使用 MongoDB,所以我继续使用它。你会推荐其他数据库吗? 这是一个非常固执己见的问题,您可以轻松地引发无 sql 与 sql 战争,但也就是说,我将两者都使用,postresql 用于关系数据(有很多节点 pgsql 驱动程序)和mongo 用于松散或准备好的数据。如果您已经了解 SQL,我认为没有必要因为您学习一门新语言而改变它。 res.status(500).json(err);之前添加console.log(err),看看它在终端打印了什么。 我想不出您想要存储和显示密码的用例。你应该对密码进行加盐和哈希处理。 【参考方案1】:

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

至于替代方案,您可以查看 AWS 的 Elastic Search(与 MongoDB 配合得很好)或 Sphinx Index(基于 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/

【讨论】:

OP 的代码中明确返回了 500 状态码,并不一定表明潜在的问题是什么。 我确实说过,但只能根据有限的信息猜测【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

这是我试图解决此问题的解决方案: 转到你的 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)
        // 
    

【讨论】:

以上是关于在NodeJS中使用带有大量数据的Datatable时搜索错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 nodejs 的 bigquery 插入方法插入地理类型数据

如何使用 Nodejs 上传带有 json 的图像

使用 nodejs Express 渲染带有数据的 html

插入并放入nodeJs + express api时,带有Redux Saga的Axios不发送表单数据

在 NodeJS 中使用带有 SQL 请求的 While 循环

Primefaces数据表更新数据表