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

Node.js中使用Mongoose连接MongoDB的异步函数执行问题求助

解决Mongoose连接MongoDB的async/await调用及后续连接关闭问题

问题分析

  1. 最初的代码中,你定义了匿名async函数但未执行,导致数据库连接逻辑被直接跳过。
  2. 修改后的代码虽然调用了verification(),但未使用await等待连接完成,后续Schema/Model定义可能在连接建立前执行(Mongoose会缓冲操作,但存在不确定性);同时因为无法在顶层直接使用await调用verification(),导致后续无法异步关闭数据库连接。

解决方案

以下两种方案都能解决你的问题,确保数据库连接完成后再启动服务,且支持异步关闭连接:

方案一:使用顶层await(Node.js 14.8+ 支持)

const express = require("express")
const app = express();
const mongoose = require("mongoose")

const uri = "你的MongoDB连接字符串";

// 顶层await等待数据库连接完成
try {
  await mongoose.connect(uri);
  console.log("Succesfully logged");
} catch (error) {
  console.log("Error", error);
  process.exit(1); // 连接失败直接退出进程
}

// 连接完成后再定义Schema和Model
const Itemx = new mongoose.Schema({
  Item: String
});

const Items = mongoose.model('Item', Itemx);

// 定义路由
app.get("/", (req, res) => {
  // 处理业务逻辑
  res.send("服务器已启动,数据库连接正常");
});

// 启动Express服务器
const PORT = 3000;
app.listen(PORT, () => {
  console.log(`服务器运行在端口 ${PORT}`);
});

// 监听进程关闭信号,异步关闭数据库连接
process.on('SIGINT', async () => {
  await mongoose.disconnect();
  console.log("数据库连接已断开");
  process.exit(0);
});

方案二:封装启动逻辑到async函数(兼容更多Node.js版本)

const express = require("express")
const app = express();
const mongoose = require("mongoose")

const uri = "你的MongoDB连接字符串";

async function startServer() {
  try {
    // 优先等待数据库连接成功
    await mongoose.connect(uri);
    console.log("Succesfully logged");

    // 连接完成后定义Schema与Model
    const Itemx = new mongoose.Schema({
      Item: String
    });
    const Items = mongoose.model('Item', Itemx);

    // 配置路由
    app.get("/", (req, res) => {
      res.send("服务器已启动,数据库连接正常");
    });

    // 启动服务器
    const PORT = 3000;
    app.listen(PORT, () => {
      console.log(`服务器运行在端口 ${PORT}`);
    });
  } catch (error) {
    console.log("Error", error);
    process.exit(1);
  }
}

// 执行启动逻辑
startServer();

// 处理进程关闭,异步断开数据库连接
process.on('SIGINT', async () => {
  await mongoose.disconnect();
  console.log("数据库连接已断开");
  process.exit(0);
});

关键说明

  • 将数据库连接、服务启动逻辑串联在async函数中,用await确保顺序执行,避免连接未完成时执行后续操作。
  • 通过监听SIGINT信号(如Ctrl+C终止进程),在异步回调中使用await mongoose.disconnect(),保证数据库连接正常关闭。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:37:38