在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 Express 渲染带有数据的 html
插入并放入nodeJs + express api时,带有Redux Saga的Axios不发送表单数据