从外部JSON加载默认数据存入MongoDB时Mongoose验证失败如何解决?
问题原因
你遇到的校验报错是以下几个原因共同导致的:
- 你读取的
test_data.json的根结构是数组,JSON.parse返回的是包含数据对象的数组,而非单个数据对象,直接传入模型构造函数会导致Mongoose无法识别到datetime、sensor、value三个必填字段 - 你使用的日期格式
dd/mm/yyyy HH:MM无法被Mongoose默认的Date类型直接解析,会生成无效日期导致校验失败 - 创建Mongoose实例未加
new关键字,且异步的save()操作没有捕获错误,会触发未处理Promise拒绝警告
解决方法
你可以参考如下代码修改数据库连接后的逻辑:
mongoose.connect("mongodb://127.0.0.1:27017/",{ useCreateIndex:true, useNewUrlParser: true, useUnifiedTopology: true} ).then(async () => { console.log('Database Successfully Connected') if(fill_default_data) { // 读取并解析JSON数据 const rawData = JSON.parse(fs.readFileSync(path.resolve(__dirname, 'test_data.json'), 'utf8')); // 处理每一项的日期格式,适配Mongoose的Date类型 const formattedData = rawData.map(item => { const [dateStr, timeStr] = item.datetime.split(' '); const [day, month, year] = dateStr.split('/'); const [hour, minute] = timeStr.split(':'); return { // 月份要减1,因为JS Date的月份从0开始计数 datetime: new Date(year, month - 1, day, hour, minute), sensor: item.sensor, value: item.value } }) // 批量插入数据,捕获错误 await DataEntry.insertMany(formattedData).catch(err => { console.log('测试数据插入失败', err) }) console.log('测试数据插入完成') } }, error => { console.log('数据库连接失败', error) } );
如果你的SensorSchema的字段定义和JSON里的sensor字段结构不一致,还需要同步调整SensorSchema的字段名或者转换JSON里的sensor字段结构。
内容的提问来源于stack exchange,提问作者binaryBigInt
相关产品推荐
相关产品推荐

