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

使用csvtojson导入CSV到MongoDB出现Date类型转换错误如何解决

问题原因

核心错误来自两个连锁问题:

  1. 日期格式解析不匹配:你CSV中导出的出生日期是DD/MM/YYYY(日/月/年)格式,原生new Date()默认按MM/DD/YYYY(月/日/年)规则解析,碰到大于12的"月份"就会返回Invalid Date,触发contactdateofbirth字段的Date类型校验错误。
  2. 计算逻辑连锁错误:无效日期传入moment后计算dayOfYear会返回NaN,和Schema定义的Number类型不匹配,触发第二个字段校验错误。
解决步骤
  • 用moment指定格式解析日期,不要依赖原生Date的自动识别逻辑,避免解析错误
  • 提前校验日期有效性,统一处理合法/非法日期的赋值逻辑,避免重复生成日期对象
  • 修正dayoftheyear的返回值类型,避免字符串和数字的隐式转换问题
修正后的代码示例
csvtojson()
    .fromFile(csvFilePath)
    .then(jsonObj => {
      console.log(jsonObj);
      jsonObj.forEach(items => {
        // 明确指定输入日期格式为DD/MM/YYYY
        const birthMoment = moment(items.contactdateofbirth, 'DD/MM/YYYY');
        // 日期无效则使用默认的1900-01-01
        const validBirthDate = birthMoment.isValid() ? birthMoment.toDate() : new Date('1900-01-01');
        // 天数直接返回数字类型,避免类型不匹配
        const dayOfYear = birthMoment.isValid() ? birthMoment.dayOfYear() : 0;

        const importContact = new Contact({
          contactsalutation: items.contactsalutation,
          contactname: items.contactname,
          contactaddress: items.contactaddress,
          contactnumber1: items.contactnumber1,
          contactnumber2: items.contactnumber2,
          contactemail: items.contactemail,
          contactdateofbirth: validBirthDate,
          dayoftheyear: dayOfYear,
          contactremark: items.contactremark,
        });
        importContact.save()
      })
    })
额外优化建议
  • 修正Schema中dayoftheyear的默认值类型,避免潜在的隐式转换问题:
dayoftheyear:{
    type:Number,
    default: 0 // 从字符串'0'改为数字0
},
  • 批量数据导入推荐用Contact.insertMany()替代循环调用save,性能更高,也更容易统一捕获处理异常。

内容的提问来源于stack exchange,提问作者Nat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 03:12:04