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

Express连接MongoDB开发API:/getusers接口加载无响应问题

问题诊断与修复:Express + MongoDB 接口请求挂起无响应

核心问题:错误处理缺失导致请求无响应

你的代码存在错误场景未处理的问题,当MongoDB连接失败、数据查询失败或插入失败时,没有向客户端返回任何响应,导致请求一直处于挂起状态,页面持续加载。

具体问题点

  1. GET /getusers 接口
    • MongoDB连接失败时,无错误响应返回
    • 执行toArray查询出错时,无错误响应返回
  2. POST /registeruser 接口
    • MongoDB连接失败时,无错误响应返回
    • 插入文档出错时,无错误响应返回
  3. 性能隐患:每次请求都创建新的MongoDB连接,未复用连接池,会导致资源浪费

修复方案

1. 补充所有错误场景的响应

在每个异步操作的错误分支中,用res.status().send()或res.json()返回错误信息,主动终止请求。

2. 复用MongoDB连接池

提前初始化数据库连接,避免每次请求重复创建连接。

修复后的完整代码

var express = require("express");
var cors = require("cors");
var mongoClient = require("mongodb").MongoClient;

var connectionString = "mongodb://127.0.0.1:27017";
let db; // 全局存储数据库连接实例

// 提前建立MongoDB连接,复用连接池
mongoClient.connect(connectionString, (err, clientObj) => {
  if (err) {
    console.error("MongoDB连接失败:", err);
    process.exit(1); // 连接失败则终止服务
  }
  db = clientObj.db("reactdb");
  console.log("MongoDB连接成功");
});

var app = express();
app.use(cors());
app.use(express.urlencoded({ extended: true }));
app.use(express.json());

app.get("/getusers", (req, res) => {
  if (!db) {
    return res.status(500).send("数据库未连接");
  }
  db.collection("tblusers").find({}).toArray((err, documents) => {
    if (err) {
      console.error("查询用户失败:", err);
      return res.status(500).json({ error: "查询用户失败" });
    }
    res.json(documents);
  });
});

app.post("/registeruser", (req, res) => {
  if (!db) {
    return res.status(500).send("数据库未连接");
  }
  var userdetails = {
    UserId: req.body.UserId,
    UserName: req.body.UserName,
    Password: req.body.Password,
    Age: parseInt(req.body.Age),
    Mobile: req.body.Mobile,
    Subscribed: req.body.Subscribed === "true"
  };
  db.collection("tblusers").insertOne(userdetails, (err, result) => {
    if (err) {
      console.error("插入用户失败:", err);
      return res.status(500).json({ error: "插入用户失败" });
    }
    console.log("Record Inserted...");
    res.redirect("/getusers");
  });
});

app.listen(4000, () => {
  console.log("Server Started : http://127.0.0.1:4000");
});

额外建议

  • 推荐使用Promise/async-await替代回调函数,提升代码可读性与可维护性
  • 用户密码需加密存储,禁止明文保存
  • 对请求参数做合法性校验,避免非法数据进入数据库

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:23:38