使用csvtojson导入CSV到MongoDB出现Date类型转换错误如何解决
问题原因
核心错误来自两个连锁问题:
- 日期格式解析不匹配:你CSV中导出的出生日期是
DD/MM/YYYY(日/月/年)格式,原生new Date()默认按MM/DD/YYYY(月/日/年)规则解析,碰到大于12的"月份"就会返回Invalid Date,触发contactdateofbirth字段的Date类型校验错误。 - 计算逻辑连锁错误:无效日期传入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
相关产品推荐
相关产品推荐

