You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

发起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');
});

关键修改说明

  1. 添加await到insertOne:确保插入操作完全执行后,再进行后续步骤,避免连接提前关闭。
  2. 使用finally块关闭客户端:保证无论插入操作成功还是失败,数据库连接都会被正确关闭,避免资源泄漏。
  3. 调整响应返回时机:只有在插入成功后才返回newUser,避免接口提前返回200但数据未写入的情况。
  4. 移除冗余依赖:原app.js中引入的{ mongo } from 'mongoose'未被使用,直接删除即可。

内容的提问来源于stack exchange,提问作者joonkidk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 23:12:12