如何让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
相关产品推荐
相关产品推荐

