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

如何让Node.js/Express服务器等待MongoDB数据库连接建立后再启动?

问题:分离文件下,如何在数据库连接完成后启动Express服务器

现有两个文件server.js和database.js,代码如下:

server.js 原代码

const express = require('express');
var db = require('./database');

const app = express();
.
.
some get/post methods
app.listen(3000);
.
.

database.js 原代码

const mongoose = require('mongoose');

const db = mongoose.connect("mongodb+srv://xxx:YYYYY@"+
    "cluster0.zrpqzwp.mongodb.net/?retryWrites=true&w=majority", {
        useNewUrlParser: true, useUnifiedTopology: true})
    .then((result) => console.log('connected to db'))
    .catch((err) => console.log(err));

需求:希望数据库连接建立完成后再执行app.listen(3000),但不想将两个文件合并,求实现方式。


解决方案

核心思路是让database.js导出数据库连接的Promise对象,在server.js中等待该Promise完成后再启动服务器。

步骤1:修改database.js,导出连接Promise

const mongoose = require('mongoose');

// 导出数据库连接的Promise,同时保留日志输出
module.exports = mongoose.connect("mongodb+srv://xxx:YYYYY@"+
    "cluster0.zrpqzwp.mongodb.net/?retryWrites=true&w=majority", {
        useNewUrlParser: true, useUnifiedTopology: true})
    .then((result) => {
        console.log('connected to db');
        return result;
    })
    .catch((err) => {
        console.log(err);
        throw err; // 抛出错误,让server.js捕获处理
    });

步骤2:修改server.js,等待连接完成后启动服务器

有两种写法可选:

写法一:使用Promise链式调用

const express = require('express');
const dbConnection = require('./database');

const app = express();

// 配置中间件、路由(your get/post methods)
// ...

// 等待数据库连接成功后启动服务器
dbConnection.then(() => {
    app.listen(3000, () => {
        console.log('Server running on port 3000');
    });
}).catch(err => {
    console.error('启动服务器失败:数据库连接出错', err);
    process.exit(1); // 连接失败时退出进程,避免无效启动
});

写法二:使用async/await(更简洁)

const express = require('express');
const dbConnection = require('./database');

const app = express();

// 配置中间件、路由(your get/post methods)
// ...

async function startServer() {
    try {
        await dbConnection; // 等待数据库连接完成
        app.listen(3000, () => {
            console.log('Server running on port 3000');
        });
    } catch (err) {
        console.error('启动服务器失败:数据库连接出错', err);
        process.exit(1);
    }
}

startServer();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 10:21:12