Nodejs与Oracle:使用心得与常见坑

Nodejs与Oracle:使用心得与常见坑

前段时间要使用oracle,搜了下决定采用node-oracle这个库.

  • 坑一

    windows各种安不上

  • 坑二

    npm上的版本有问题,需要到github下载它的源码包再手动安装.

  • 坑三

    如果使用pool的话,记得初始化时需要connection.setAutoCommit(true),否则数据库刷不出记录.

结论:

虽然最终在windows上编译通过,但如果你也用了它,一旦编译不通过赶紧撤吧,去linux搞; 遇到需要编译的第三方库,要清楚自己机器的配置(node版本、vs版本、环境变量)是否正确并满足编译要求; 没事千万别用oracle.


13 回复

Nodejs与Oracle:使用心得与常见坑

前段时间要使用Oracle数据库,经过一番调研后决定采用node-oracle这个库。以下是我在这过程中遇到的一些坑以及一些使用心得。

坑一:Windows安装问题

在Windows系统中安装node-oracle遇到了不少麻烦。通常情况下,直接通过npm安装可能会失败,因为这个库需要依赖于一些本地的C++扩展,这些扩展可能无法自动编译成功。例如:

npm install oracledb --save

这一步可能需要手动下载并编译源码才能成功安装。

坑二:npm上的版本问题

即使你成功安装了node-oracle,也可能发现npm上发布的版本存在问题。我推荐直接从GitHub上下载源码包,然后手动安装。步骤如下:

  1. 先从GitHub下载源码:
    git clone https://github.com/oracle/node-oracledb.git
    
  2. 进入目录并安装:
    cd node-oracledb
    npm install
    

坑三:连接池设置问题

在使用连接池时,需要确保每个连接都设置了autoCommittrue,否则可能会导致事务未提交,数据不会被持久化到数据库中。示例代码如下:

const oracledb = require('oracledb');

async function run() {
    // 创建连接池
    await oracledb.createPool({
        user: "myuser",
        password: "mypassword",
        connectString: "localhost/XEPDB1"
    });

    let connection = await oracledb.getConnection();
    
    // 设置autoCommit为true
    connection.autoCommit = true;

    try {
        // 执行SQL语句
        const result = await connection.execute("INSERT INTO mytable (id, name) VALUES (:1, :2)", [1, 'Test']);
        console.log(result);
    } catch (err) {
        console.error(err);
    } finally {
        // 释放连接
        if (connection) {
            await connection.close();
        }
    }
}

run().catch(err => console.error(err));

结论

尽管最终在Windows上成功编译并通过了测试,但强烈建议在Linux环境下进行开发,因为编译过程更为稳定。此外,务必确保你的机器配置(如Node.js版本、VS版本、环境变量等)满足编译要求。最后,如果可能的话,尽量避免使用Oracle数据库,因为它可能带来不必要的复杂性和麻烦。


oracle 资源太少了。。关于node的

node用oracle的不多,没需求没市场,不想mysql那样,各种库,各种解决方案

在linux下的话,oracle编码是zhs.16GBK node使用的utf8请问是否要转码

最终你用上 oracle 没有

客户要求,不用不行.

我现在正遇到了编码问题,同样的程序跑在我自己的虚拟机ubuntu上拿回来的数据中文正常,把程序放到另一台ubuntu上,拿回来的就是中文乱码

我用npm的,没问题,可能是我的node版本比较老吧。 用oracle,都习惯手动commit。 JAVA项目的datasource,只要数据库是oracle,我也会故意setAutoCommit(false)。

最近正好尝试win7下 node.js 连接 oracle, 已成功连上并能执行增/删/改/查的sql. 请移步查看博文: http://my.oschina.net/zenglingfan/blog/164390 或者在 google 里搜索 《Windows7 下 Node.js 连接 Oracle》

我是在linux上安装成功的,分享下经验,这是我的博文 http://blog.gaoqixhb.com/p/53d98e7f3cff58870566e9b4

windows上没有尝试过,之前碰到一个人讨论过,他的windows上安装不上貌似是VS的版本问题,按照那个github里面的VS2012版本好像就可以了

node-oracle实在是大坑,windows四个人同时试着安装,最后都没安装上

Node.js 与 Oracle:使用心得与常见坑

坑一: Windows 安装问题

在Windows系统上安装node-oracle可能会遇到一些问题。通常情况下,这个问题是由于缺少必要的编译工具或依赖库导致的。

解决方案: 确保你的系统已经安装了Visual Studio Build Tools,并且设置好了环境变量。你也可以尝试使用其他版本的Node.js或者在Linux上进行开发。

npm install --global windows-build-tools

坑二: npm 版本问题

npm 上的某些版本可能存在问题,建议直接从GitHub下载源码包手动安装。

解决方案: 从GitHub克隆项目源码并手动安装:

git clone https://github.com/nearinfinity/node-oracle.git
cd node-oracle
npm install

坑三: 使用连接池时需要设置自动提交

当你使用连接池时,需要显式地设置connection.setAutoCommit(true)来确保事务能够正常提交。

示例代码:

const oracledb = require('oracledb');

async function run() {
    // 创建连接池
    await oracledb.createPool({
        user: 'your_username',
        password: 'your_password',
        connectString: 'your_connection_string'
    });

    // 获取连接
    let connection;
    try {
        connection = await oracledb.getConnection();

        // 设置自动提交
        await connection.execute("ALTER SESSION SET AUTOCOMMIT=TRUE");

        // 执行SQL语句
        const result = await connection.execute(
            "INSERT INTO your_table (column1, column2) VALUES (:val1, :val2)",
            { val1: 'data1', val2: 'data2' },
            { autoCommit: true }
        );
        console.log(result);
    } catch (err) {
        console.error(err.message);
    } finally {
        if (connection) {
            try {
                await connection.close();
            } catch (err) {
                console.error(err.message);
            }
        }
    }

    // 关闭连接池
    await oracledb.releasePool();
}

run();

结论

尽管最终在Windows上编译通过,但如果你遇到了编译问题,建议切换到Linux系统进行开发。确保你的机器配置(Node.js版本、VS版本、环境变量)符合编译要求。使用Oracle可能会遇到很多问题,如果不是必须,尽量避免使用。

回到顶部