You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法时出错。

核心排查点

  1. 检查stampCurrentDate()返回值:
    • 如果返回的是自定义对象、非标准日期字符串,Firestore无法识别,会尝试将其转为日期对象后调用toMillis,从而报错。
    • 如果返回的是标准Date实例、ISO格式字符串或毫秒时间戳,Firestore才能正常处理。
  2. 服务器端变量名冲突:
    服务器里用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:10:43