关于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);
});
解释
- 异步函数:
connectToDatabase
函数是一个异步函数,使用await
关键字来等待数据库连接完成。 - 错误处理:使用
try-catch
结构来捕获连接过程中的任何错误。 - 启动服务器:一旦数据库成功连接,调用
startServer
函数启动HTTP服务器。 - 资源释放:确保在连接完成后正确关闭数据库连接,以释放资源。
这种方法不仅避免了阻塞主线程,还提供了更好的错误处理和资源管理能力。希望这个示例对你有所帮助。
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. 不知道前辈们是怎么搞重定向的问题的
是数据库又设置超时机制,连接没用定时去刷新就会段吧