关于Nodejs数据库连接的问题

关于Nodejs数据库连接的问题

我先说明下情况: 我用的是oracle数据库, 一般情况下(之前一直都是) 当我项目启动的时候,也就是在终端输入node server.js以后 立马就会显示数据库已经连接上了。 但是 今天下午,数据库卡了还是怎么地,连接要一会时间,所以在这种情况下,项目启动了,数据库实际上还没有连接。然后就各种报错了. 因为是练手的代码,所以我没有写异常捕捉,而且我认为如果是中途数据库断开了,捕捉异常是可以的,像这种项目启动的时候数据库登陆有延迟,如果去捕捉异常不太合适, 所以我自己有个想法,就是在 server.listen(3000); 监听启动之前 写一个死循环 来等待 数据库实例返回,

if(db.connection!=undefined){
	server.listen(3000);
	console.log("3000端口启动了!")
}else{
while (true){
	if(db.connection!=undefined){
	console.log("连接了!");
	}
	
貌似 这个真是单线程里面的死循环,就这样死了....
有没有前辈有好的解决方案,坐等前辈解答(顺便去看看nodejs的Process)
}
}

4 回复

针对你提到的情况,确实存在一种更优雅的方式来处理数据库连接延迟问题,而不是使用死循环来轮询检查数据库连接状态。Node.js 是一个非阻塞、事件驱动的平台,使用死循环会导致程序无法继续执行后续逻辑,这并不是最佳实践。

解决方案

你可以利用异步编程模型来处理数据库连接,并在连接成功后启动服务器。这样可以避免阻塞主线程,同时也能更好地处理错误和重试机制。

示例代码

const oracledb = require('oracledb');
const http = require('http');

async function connectToDatabase() {
    let connection;

    try {
        // 尝试连接到数据库
        connection = await oracledb.getConnection({
            user: 'yourUsername',
            password: 'yourPassword',
            connectString: 'yourConnectionString'
        });

        console.log('数据库连接成功!');

        // 成功连接后启动服务器
        startServer();
    } catch (err) {
        console.error('数据库连接失败:', err.message);
        // 如果连接失败,可以尝试重新连接或抛出错误
        throw new Error('数据库连接失败');
    } finally {
        if (connection) {
            try {
                // 确保关闭连接
                await connection.close();
            } catch (err) {
                console.error('关闭数据库连接时发生错误:', err.message);
            }
        }
    }
}

function startServer() {
    const server = http.createServer((req, res) => {
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end('Hello World\n');
    });

    server.listen(3000, () => {
        console.log('服务器已启动,监听3000端口');
    });
}

// 调用函数尝试连接数据库
connectToDatabase().catch(err => {
    console.error('初始化过程中发生错误:', err.message);
});

解释

  1. 异步函数connectToDatabase 函数是一个异步函数,使用 await 关键字来等待数据库连接完成。
  2. 错误处理:使用 try-catch 结构来捕获连接过程中的任何错误。
  3. 启动服务器:一旦数据库成功连接,调用 startServer 函数启动HTTP服务器。
  4. 资源释放:确保在连接完成后正确关闭数据库连接,以释放资源。

这种方法不仅避免了阻塞主线程,还提供了更好的错误处理和资源管理能力。希望这个示例对你有所帮助。


app.get('/',function(req,res,next){
	if(db.connection!=undefined){
		res.render('sampleInput.html')
		console.log("3000端口启动了!!")
}else{
		res.render('err.html',{msg:"数据库正在链接中.."})
		setTimeout(function(){
					res.redirect('sampleInput.html')
		},10000)
}
});

本来是想 重定向一个URL 但是这样会报错

Can’t set headers after they are sent. 不知道前辈们是怎么搞重定向的问题的

是数据库又设置超时机制,连接没用定时去刷新就会段吧

针对你的问题,你可以使用异步编程的方式来处理数据库连接延迟的情况。Node.js 是基于事件驱动和非阻塞I/O模型的,所以直接使用死循环并不是一个好的解决方案,因为它会阻塞整个进程。

解决方案

你可以使用 Promise 或 async/await 来处理数据库连接。这样可以确保在监听服务器之前,数据库已经成功连接。

示例代码

假设你使用的是 oracledb 模块来连接 Oracle 数据库:

const oracledb = require('oracledb');
const http = require('http');

async function connectToDatabase() {
    let connection;

    try {
        // 创建数据库连接
        connection = await oracledb.getConnection({
            user: "your_username",
            password: "your_password",
            connectString: "your_connection_string"
        });

        console.log("数据库已连接");

        // 启动服务器
        startServer();
    } catch (err) {
        console.error(err.message);
        process.exit(1); // 如果数据库连接失败,退出程序
    } finally {
        if (connection) {
            try {
                // 关闭数据库连接
                await connection.close();
            } catch (err) {
                console.error(err.message);
            }
        }
    }
}

function startServer() {
    const server = http.createServer((req, res) => {
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end('Hello World\n');
    });

    server.listen(3000, () => {
        console.log('服务器运行在 http://localhost:3000/');
    });
}

// 调用连接函数
connectToDatabase();

解释

  1. 异步函数connectToDatabase 函数是一个异步函数,它使用 await 关键字等待数据库连接完成。
  2. 错误处理:在 try...catch 块中捕获并处理可能的错误。
  3. 启动服务器:当数据库连接成功后,调用 startServer() 函数来启动服务器。
  4. 关闭连接:在 finally 块中确保即使在发生错误时也能关闭数据库连接。

这种方式避免了死循环阻塞问题,并且能够优雅地处理数据库连接延迟的情况。

回到顶部