【发布时间】:2019-04-22 09:08:28
【问题描述】:
我正在创建一个使用 Node.js 和 Express 的 RESTful API。我的应用程序使用 Oracle 数据库,所以我从 npm 安装了 node-oracledb 模块。我浏览了文档并查看了模块的 github 页面中提供的一些示例;但是,我没有看到任何使用连接池的示例。如果我错了,请纠正我,但对于将多次调用数据库的应用程序,建议使用连接池而不是使用独立连接。以下是我编写的代码示例:
createPool = function(poolAttrs, fetchPool){
oracledb.createPool(poolAttrs, function(error, pool){
if(error){
console.error(`Could not create pool using specified attributes: `, error.message);
}
else{
console.log(`Pool created successfully using poolAlias: ${poolAttrs.poolAlias}`);
fetchPool(pool);
}
});
};
createConnection = function(poolAlias, connection){
oracledb.getConnection(poolAlias, function(error, conn){
if(error){
console.error(`Could not get connection: `, error.message);
} else {
console.log(`New connection obtained: ${conn}`);
connection(conn);
}
});
};
executeQuery = function(queryString, poolAlias){
console.log(queryString);
var conn = createConnection(poolAlias, function connection(conn){
conn.execute(queryString, function(error, result){
if(error){
console.error(`Could not execute query: `, error.message);
} else {
console.log(result);
}
conn.close(function(error){
if(error){
console.error(`Could not close connection.`);
} else {
console.log(`Connection successfully closed.`);
}
})
});
});
}
closePool = function(pool){
pool.close(60, function(error){
if(error){
console.error(`Could not close connection pool ${pool.poolAlias}`, error.message);
} else {
console.log(`Pool closed successfully.`);
}
});
};
createPool(attrs, function fetchPool(pool){
var poolAlias = pool.poolAlias;
console.log(poolAlias);
});
executeQuery(queryString, attrs.poolAlias);
当我运行此代码时,我收到以下错误:
Could not get connection: NJS-047: poolAlias "amDBpool" not found in the connection pool cache
我知道为什么会发生错误。根据我对回调的理解,我知道使用 fetchPool(pool) 回调调用异步 createPool() 函数会在回调堆栈中注册此回调 (fetchPool)。所有同步代码都将在它之前执行。因此,当我调用 executeQuery 并且函数到达调用 createConnection(poolAlias...) 的执行行时,poolAlias 变量为 null,因为 createPool 函数仍在回调堆栈中等待执行。因此,不存在别名为“poolAlias”的池,并且调用失败。我知道我可以在 executeQuery 方法中调用 createPool ,但是每次执行查询时不会尝试创建一个新池吗?我的问题是,有没有办法在 executeQuery 方法内部测试池是否存在,如果不存在,则不要尝试重新创建它。除此之外,唯一的其他方法是使用 Promises 或 Async/Await 对吗?
【问题讨论】:
标签: javascript node.js callback node-oracledb