发起POST请求时MongoDB Server异常关闭问题求助
解决MongoServerClosedError:数据未写入MongoDB但接口返回200的问题
问题根源
你的代码存在两个关键问题,导致数据库连接提前关闭、插入操作中断:
insertOne是异步操作,你没有用await等待它执行完成,代码会直接跳去执行client.close(),此时插入任务还在后台运行,但MongoDB客户端已被关闭,触发MongoServerClosedError。client.close()和res.json()的执行时机错误,不管插入操作是否完成,都会直接关闭连接并返回响应,导致异步插入被中断。
修复后的代码
db.js 修正版
const MongoClient = require('mongodb').MongoClient; const url = 'mongodb+srv://url-here' const createUser = async (req, res, next) => { const newUser = { name: req.body.name, username: req.body.username, password: req.body.password }; const client = new MongoClient(url); try { await client.connect(); const db = client.db(); // 等待插入操作完成 await db.collection('users').insertOne(newUser); // 插入成功后再返回响应 res.json(newUser); } catch (error) { return res.json({message: 'Could not store data', error: error.message}); } finally { // 无论成功失败,最后关闭客户端连接 await client.close(); } }; exports.createUser = createUser; // 注意:原代码中未定义getUsers,需补充实现或删除该导出 // exports.getUsers = getUsers;
app.js 优化版(移除冗余依赖)
const express = require('express'); const bodyParser = require('body-parser'); const mongoPractice = require('./config/db'); const app = express(); app.use(bodyParser.json()); app.post('/users', mongoPractice.createUser); app.listen(3000, () => { console.log('Server running on port 3000'); });
关键修改说明
- 添加
await到insertOne:确保插入操作完全执行后,再进行后续步骤,避免连接提前关闭。 - 使用
finally块关闭客户端:保证无论插入操作成功还是失败,数据库连接都会被正确关闭,避免资源泄漏。 - 调整响应返回时机:只有在插入成功后才返回
newUser,避免接口提前返回200但数据未写入的情况。 - 移除冗余依赖:原
app.js中引入的{ mongo } from 'mongoose'未被使用,直接删除即可。
内容的提问来源于stack exchange,提问作者joonkidk
相关产品推荐
相关产品推荐

