Mongoose的insertMany与create方法在路由中失效致服务器重启
问题排查与解决方案
1. 先抓未捕获异常(服务器重启核心原因)
路由里的数据库操作如果没做错误处理,一旦抛出异常会直接搞崩Node.js进程。独立脚本里可能隐性处理了异常,但Express路由里没兜底的话就会触发重启。
- 给
insertMany/create套上try/catch,同时用next()传递错误:
async function getDownloadFile(req, res, next) { try { // 你的CSV解析逻辑... const result = await SomeDatabaseModel.insertMany(parsedJsonData); console.log(`成功插入${result.length}条数据`); res.status(200).send(`导入完成,共${result.length}条`); } catch (err) { console.error('导入失败详情:', err); next(err); // 交给Express全局错误处理 } }
- 必须加全局错误处理中间件,避免进程崩溃:
app.use((err, req, res, next) => { console.error('全局错误栈:', err.stack); res.status(500).send('服务器内部处理失败'); });
2. 拆分大数据量插入
4900+条一次性插入容易触发超时、内存预警,甚至数据库限流:
- 分批次插入,比如每次插100条:
async function batchInsert(data, batchSize = 100) { let totalInserted = 0; for (let i = 0; i < data.length; i += batchSize) { const batch = data.slice(i, i + batchSize); await SomeDatabaseModel.insertMany(batch); totalInserted += batch.length; console.log(`已插入${totalInserted}/${data.length}条`); } return totalInserted; } // 路由内调用 const total = await batchInsert(parsedJsonData);
- 可选:关闭数据验证提升插入速度(确保数据本身合法的情况下):
await SomeDatabaseModel.insertMany(parsedJsonData, { validateBeforeSave: false, timeout: 30000 // 延长超时到30秒 });
3. 确认数据库连接就绪
Express启动时可能没等Mongoose连接成功就接收请求,导致插入操作无响应:
- 把服务器启动逻辑放在Mongoose连接成功的回调里:
mongoose.connect(process.env.MONGODB_URI) .then(() => { console.log('数据库连接成功'); app.listen(3000, () => console.log('服务器启动完成')); }) .catch(err => console.error('数据库连接失败:', err));
4. 排查热重载工具干扰
如果用了nodemon,插入数据时若修改了CSV、日志等文件,会触发自动重启:
- 在
nodemon.json里添加忽略规则:
{ "ignore": ["*.csv", "logs/*", "temp/*"] }
或者启动时直接加参数:nodemon --ignore *.csv server.js
5. 验证解析数据一致性
确保路由里解析出的parsedJsonData和独立脚本里的格式完全一致,比如有没有空字段、类型不匹配的情况:
- 插入前打印前2条数据对比:
console.log('解析数据示例:', parsedJsonData.slice(0, 2));
内容的提问来源于stack exchange,提问作者Orion
相关产品推荐
相关产品推荐

