使用DataTables searchPanes+服务器端POST请求时遇TypeError求助
问题根源
你遇到的错误是因为DataTables的ajax.data函数期望返回一个可修改的对象,但你返回了JSON.stringify(d)生成的字符串。DataTables在发送请求前会自动给请求数据添加searchPanes等扩展参数,但字符串是不可变的原始类型,无法添加新属性,因此触发TypeError。
解决方案
方法1:让DataTables自动处理JSON转换(推荐)
不要手动JSON.stringify,直接返回处理后的对象,同时配置contentType为application/json,DataTables会自动把对象序列化为JSON字符串发送给服务器:
$('#yourTable').DataTable({ ajax: { url: '你的服务器接口地址', type: 'POST', contentType: 'application/json', // 必须配置这个,告诉服务器接收JSON格式 data: function(d) { // 这里可以对d对象做自定义修改,比如添加额外参数 // d.extraParam = '自定义值'; return d; // 返回原始对象,DataTables会自动处理序列化 } }, // 其他DataTables配置项... });
方法2:手动在请求发送前序列化
如果需要先对请求对象做复杂处理,再手动序列化,可以在beforeSend钩子中完成,避免直接返回字符串:
$('#yourTable').DataTable({ ajax: { url: '你的服务器接口地址', type: 'POST', data: function(d) { // 先修改d对象,比如调整参数、添加自定义数据 d.draw = parseInt(d.draw) + 1; return d; // 返回对象,让DataTables先完成扩展参数的添加 }, beforeSend: function(xhr, settings) { // 在发送请求前,把对象序列化为JSON字符串 settings.data = JSON.stringify(settings.data); // 设置请求头,告诉服务器接收JSON xhr.setRequestHeader('Content-Type', 'application/json'); } }, // 其他DataTables配置项... });
为什么之前的GET请求没问题?
GET请求时,DataTables会把data函数返回的对象自动转成URL查询参数(key=value&...),不需要序列化JSON,所以不会触发这个问题。改成POST后,直接返回字符串打破了DataTables的内部处理流程,才出现错误。
内容的提问来源于stack exchange,提问作者Ronny Portillo
相关产品推荐
相关产品推荐

