Uncaught TypeError: 无法读取undefined的toMillis属性问题求助
问题描述
我知道这类错误大多由语法问题导致,但这次应该不是——搜遍所有代码文件都找不到toMillis字样,完全搞不懂触发原因。这个错误是在用jQuery的$.post向Express服务器发送请求并获取响应时出现的,且此处语法格式和其他正常运行的场景完全一致。
错误触发在student messaging文件的325行:
$.post('/sendNewMessage', a, function (data, status) {
368行是调用包含这段客户端代码的函数。
客户端JS代码
var currD = stampCurrentDate(); var a = { currentChatUID: currentChatUID, message: message, Date: currD}; $.post('/sendNewMessage', a, function (data, status) { var isError = data.Error; if(isError == "yes") { displayErrorMessage("Error Sending Message"); id('chatroom_body').style.borderColor = "red"; setTimeout(function() { id('chatroom_body').style.borderColor = "#242F36"; }, 3000); return; } console.log("Message Successfully Sent"); const chat = findChatByUID(chats, currentChatUID); console.log(chat); console.log(chat.user2Messages); chat.lastSentDate = stampCurrentDate(); chat.user2Messages.push(new Message(stampCurrentDate(), message, 2)); console.log(chat.user2Messages); console.log(chats); getChatProfilePictures(getChatsWOProfile()); });
Express服务器代码
app.post('/sendNewMessage', function(req, res) { var currentChatUID = req.body.currentChatUID; var message = req.body.message; var Date = req.body.Date; db.collection("Messaging").doc(currentChatUID).update({ User2Messages: db.firestore.FieldValue.arrayUnion({Message: message, Date: Date, Read: false}), Last: Date, }).then(() => { res.send({juice:"juice"}); }).catch((err) => { console.log(err) var dataToSend = {Error:"yes"}; res.json(dataToSend); }) })
错误截图

排查与解决
虽然代码里没直接出现toMillis,但这个错误是Firestore内部处理日期时触发的——你传给服务器的Date值(即currD)格式不符合Firestore预期,导致Firestore尝试调用日期对象的toMillis方法时出错。
核心排查点
- 检查
stampCurrentDate()返回值:- 如果返回的是自定义对象、非标准日期字符串,Firestore无法识别,会尝试将其转为日期对象后调用
toMillis,从而报错。 - 如果返回的是标准
Date实例、ISO格式字符串或毫秒时间戳,Firestore才能正常处理。
- 如果返回的是自定义对象、非标准日期字符串,Firestore无法识别,会尝试将其转为日期对象后调用
- 服务器端变量名冲突:
服务器里用var Date = req.body.Date;会覆盖全局Date构造函数,可能导致后续日期处理异常,建议改成var messageDate = req.body.Date;。
具体修复方案
方案1:客户端统一日期格式
确保stampCurrentDate()返回Firestore兼容的格式,比如ISO字符串或毫秒时间戳:
// 转成ISO格式字符串 var currD = new Date(stampCurrentDate()).toISOString(); // 或者转成毫秒时间戳 var currD = new Date(stampCurrentDate()).getTime();
方案2:服务器端强制转换日期
在更新数据库前,将接收的日期转为Firestore支持的Timestamp或Date对象:
app.post('/sendNewMessage', function(req, res) { var currentChatUID = req.body.currentChatUID; var message = req.body.message; var messageDate = req.body.Date; // 重命名避免冲突 // 转成Firestore Timestamp const firestoreDate = db.firestore.Timestamp.fromDate(new Date(messageDate)); db.collection("Messaging").doc(currentChatUID).update({ User2Messages: db.firestore.FieldValue.arrayUnion({Message: message, Date: firestoreDate, Read: false}), Last: firestoreDate, }).then(() => { res.send({juice:"juice"}); }).catch((err) => { console.log(err) var dataToSend = {Error:"yes"}; res.json(dataToSend); }) })
内容的提问来源于stack exchange,提问作者blueberrr
相关产品推荐
相关产品推荐

