FullCalendar加载动态日程报callback is not a function错误及事件异常
问题根因定位与解决方案
一、callback is not a function 报错问题
根因
你当前使用的FullCalendar版本早已废弃了旧版的4参数events函数写法:
- FullCalendar v3及更早版本的events函数签名为
function(start, end, timezone, callback),需要手动调用末尾的callback参数回传事件数据 - FullCalendar v4及之后版本,完全重构了事件加载的参数逻辑,函数签名调整为
function(fetchInfo, successCallback, failureCallback),原位置的第四个参数早已不存在,你强行把第四个形参命名为callback并调用时,实际拿到的是无函数属性的普通值,因此触发类型错误。
这类报错大多是参考v3版本的老旧接入教程写代码、升级到新版本后没有同步调整参数逻辑导致的。
修复方案
替换events配置的回调传参逻辑,适配新版本的参数规则,参考代码:
events: function(fetchInfo, successCallback, failureCallback) { jQuery.ajax({ url: "/getAllCitas", type: "GET", success: function (doc) { // 事件组装逻辑保持原有结构 var events = []; doc.forEach(function (evt) { events.push({ title: evt.paciente?.nombre || '未命名预约', start: evt.date, end: evt.date }); }); // 调用第二个入参的官方successCallback回传数据,而非自定义的第四个形参 successCallback(events); }, error: function(err) { // 加载失败时调用错误回调,避免日历组件渲染卡住 failureCallback(err); } }); }
如果使用现代语法,也可以直接通过Promise返回事件数据,省去手动回调的逻辑:
events: async function(fetchInfo) { const res = await fetch('/getAllCitas'); const doc = await res.json(); return doc.map(evt => ({ title: evt.paciente?.nombre || '未命名预约', start: evt.date, end: evt.date })); }
二、事件title为undefined的问题
根因
从你输出的控制台结果可以判断,接口返回的paciente字段存在多版本数据结构混用的情况:
- 部分历史预约记录的
paciente字段为空(null/未赋值),直接读取evt.paciente会返回undefined - 部分预约记录采用关联外键存储患者信息,因为后端populate逻辑失效,直接返回了患者表的ObjectID(即你看到的
603fd0e423f0d241ecfdd337这类异常值) - 少数预约记录的关联查询执行正常,返回了类似
Carlos的正常姓名字符串
修复方案
- 先在控制台打印单条
evt的完整结构,确认患者名字的实际存储路径,避免字段路径匹配错误 - 组装事件时增加兜底逻辑,避免空值显示:
events.push({ title: evt.paciente?.nombre || evt.paciente || '未命名预约', start: evt.date, end: evt.date }); - 优化后端接口的关联查询逻辑,确保所有预约记录的患者信息都能被正确关联,不要直接把外键ID暴露在接口返回中
内容的提问来源于stack exchange,提问作者NathaThink
相关产品推荐
相关产品推荐

