Mongoose导入JSON文件时出现buffering timed out超时错误如何解决
错误原因
该报错的核心原因是调用save()方法时Mongoose还未与MongoDB建立成功连接:
- 你的数据库连接逻辑写在服务入口文件中,是异步执行的,而路由文件中的
importData()是脚本加载后立刻同步执行的,执行顺序早于Mongoose连接成功的回调。 - 如果你是单独运行该路由文件做数据导入,该文件内根本没有执行
mongoose.connect()的逻辑,Mongoose一直处于未连接状态,所有数据库操作都会进入缓冲队列,超过默认10秒就会抛出超时错误。 - POST请求能正常入库是因为请求是在服务启动、Mongoose连接成功之后才接收的,此时数据库连接已经就绪,所以操作不会超时。
可行解决方案
- 方案1:将导入逻辑放到数据库连接成功的回调中执行
如果你需要服务启动时自动执行导入,直接把导入逻辑挪到mongoose.connect()的then回调中,修改入口文件代码:
同时修改路由文件,导出// 先引入导入方法 const { importData } = require('./routers/people') mongoose.connect('mongodb://localhost:27017/people').then(async () => { console.log('Connected to mongoDB'); // 连接成功后再执行导入 await importData() app.listen(port, () => { console.log(`App is listening at port ${port}`); }); });importData方法,删除文件中直接调用importData()的代码:// 删掉这行:importData() module.exports = { router, importData } - 方案2:编写独立的导入脚本
如果你只需要单次导入数据,不想每次启动服务都执行导入逻辑,可以单独写一个导入脚本:
直接运行该脚本即可完成导入,不需要启动web服务。const fs = require('fs/promises') const mongoose = require('mongoose') const Person = require('./models/people') const importData = async () => { // 先建立数据库连接 await mongoose.connect('mongodb://localhost:27017/people') console.log('数据库连接成功,开始导入数据') const data = await fs.readFile('./people.json') const dataParsed = JSON.parse(data) // 推荐用insertMany批量插入,比循环save效率高很多 await Person.insertMany(dataParsed) console.log('数据导入完成') // 导入完成后断开连接 await mongoose.disconnect() } importData().catch(err => console.error('导入失败:', err)) - 方案3:临时调高缓冲超时时间(不推荐,治标不治本)
如果确认连接逻辑没问题只是连接建立较慢,可以在连接时配置延长超时时间:mongoose.connect('mongodb://localhost:27017/people', { bufferTimeoutMS: 30000 // 改为30秒超时 })
内容的提问来源于stack exchange,提问作者crazyfrog
相关产品推荐
相关产品推荐

