第2部分:创建REST API:数据库基础
在
第一篇文章中,您创建了一个Web服务器,在这里您将创建一个模块,该模块负责使用
node-oracledb启动和
关闭数据库连接池。 并添加一项功能,该功能通过自动从池中获取和释放连接来简化简单语句的执行。
运行连接池
由于node-oracledb是在OCI客户端库的基础上构建的,因此它内置支持创建客户端的OCI池,并具有出色的性能特征。 要创建连接池,请首先在
config目录中创建一个名为
database.js的新配置文件。 将以下代码复制并粘贴到文件中,然后保存更改。
module.exports = { hrPool: { user: process.env.HR_USER, password: process.env.HR_PASSWORD, connectString: process.env.HR_CONNECTIONSTRING, poolMin: 10, poolMax: 10, poolIncrement: 0 } };
与
config / webserver.js文件一样,此文件允许您使用环境变量设置一些属性。 使用环境变量可在不同环境中部署应用程序时提供灵活性,并有助于将密码和其他敏感信息保存在源代码之外。 从终端运行以下命令来设置必要的环境变量,并确保它们在以后的终端会话中可用。
echo "export HR_USER=hr" >> ~/.bashrc echo "export HR_PASSWORD=oracle" >> ~/.bashrc echo "export HR_CONNECTIONSTRING=0.0.0.0/orcl" >> ~/.bashrc source ~/.bashrc
您可能会注意到poolMin和poolMax相同,并且poolIncrement设置为0。这将创建一个固定大小的池,该池需要较少的管理资源-这对于获得一致使用率的池来说是个好主意。
尽管Node.js通常被描述为“单线程”,但它具有用于某些操作的线程池,这些操作否则会阻塞运行JavaScript代码的主线程。 node-oracledb使用此线程池执行其所有异步操作,例如接收连接以及执行SQL和PL / SQL代码。 但是,默认线程池大小为4。如果希望池中的所有10个连接同时工作,则需要相应地增加线程数。
UV_THREADPOOL_SIZE环境变量可用于调整线程池大小。 UV_THREADPOOL_SIZE可以在运行Node.js应用程序之前设置或在内部运行,但必须在使用线程池进行第一次调用之前设置。 这是由于以下事实:线程池是在首次使用时创建的,而在创建之后,其大小是固定的。 打开应用程序根目录中的
index.js文件,并在第一行(包含Web服务器模块)之后添加以下几行。
现在,线程池具有适当的大小,您可以转到数据库模块。 在名为
database.js的
服务目录中创建一个新文件。 将以下代码复制并粘贴到其中并保存更改。
const oracledb = require('oracledb'); const dbConfig = require('../config/database.js'); async function initialize() { const pool = await oracledb.createPool(dbConfig.hrPool); } module.exports.initialize = initialize;
本模块首先介绍node-oracledb和配置文件。 然后,使用名称initialize定义一个异步函数,然后通过module.exports对象提供该函数。 初始化函数创建一个连接池,该
连接池作为默认池存储在
连接池的
内部缓存中 。
现在,您需要连接所有内容,以便在打开Web服务器之前启动连接池。 返回
index.js并在第1行下方添加以下行。
然后,将以下try块添加到stratup函数中,紧接在启动Web服务器的现有try块之前。
try { console.log('Initializing database module'); await database.initialize(); } catch (err) { console.error(err); process.exit(1);
此时,您可以安装node-oracledb并测试代码。 在hr_app目录的终端中运行以下命令。
npm install oracledb -s node .
如果您看到有关数据库模块和Web服务器正在运行的消息,那么恭喜您-您的连接池正在运行!
关闭连接池
如果现在关闭应用程序(如前所述,使用ctrl + c),则在关闭连接池之前,Node.js进程将被销毁。 尽管应该自动清理所有相关的数据库进程,但是最好在退出Node.js进程之前显式关闭连接池。
返回到
services / database.js文件,将以下代码行添加到末尾,并保存更新。
close函数使用oracledb.getPool()方法同步获取默认池,然后在池上调用close方法将其关闭。
要在正确的时间调用close函数,请在停止Web服务器的现有try块之后,立即将以下代码行添加到shutdown函数内的
index.js文件中。
如果再次启动并关闭该应用程序,则会看到在关闭Web服务器之后但在该过程完成之前,数据库模块已关闭。
简化简单的CRUD操作
使用node-oracledb执行SQL或PL / SQL代码通常分为三个步骤:获取连接,执行代码,然后释放连接。 如果您要做的只是一个调用即可执行(不需要多步事务),那么接收和释放连接可能看起来像标准代码。 我喜欢创建一个函数,在一个调用中执行全部三个操作。 返回到
services / database.js文件,在下面添加以下代码并保存更改。
通常,您不会在Web服务器模块中使用数据库模块,而是立即添加它以验证其是否正常运行。 打开
services / web-server.js文件,并在顶部现有常量声明下添加以下行。
然后,使用以下代码替换响应为“ Hello World!”的整个app.get处理程序。 (所有3行)。
新的处理程序使用数据库模块的simpleExecute函数从数据库中检索当前用户和systimestamp的值。 然后,将这些值用于模板文字中,以通过动态消息响应客户端。
再次启动该应用程序,然后转到localhost:3000。您应该看到类似下图的内容。

如果您看到此消息,则说明一切正常。
在下一篇文章中,您将继续通过添加GET请求的路由,控制器和数据库逻辑来创建API。