nodejs从oracle数据库读取到二进制,并将二进制转化为文件(pdf,excel,word等文件格式)

76 阅读2分钟

 1.封装oracle数据库连接使用

安装oracledb  

npm i oracledb

创建oracledb.js文件

const Oracledb = require('oracledb');
module.exports={
//连接数据库
     connect(config) {
        return new Promise(function (resolve, reject) {
          try {
            Oracledb.getConnection(config, function (err, conn) {
              if (err) {
                console.log("oracle数据库连接失败");
                resolve({
                  status: -1,
                  msg: '数据库连接失败',
                  detail: err.message
                })  
                return
              }
              console.log("oracle数据库连接成功");
              resolve(conn);
            });
          } catch (ex) {
            console.log("oracle数据库连接出错");
            resolve({
              status: -1,
              msg: '数据库连接出错',
              detail: ex||'数据库连接时出现未知原因错误'
            })
          }
        });
      },
//执行sql语句
       execute(conn, sql) {
          return new Promise(function (resolve, reject) {
            try {
              conn.execute(
                sql,
                [],
                { outFormat: Oracledb.OBJECT },
                function (err, result) {
                  if (err) {
                    console.log(111,err.message)
                    resolve({
                      status: -1,
                      msg: '执行sql语句失败',
                      detail: err.message
                    })
                    return
                  }
                  resolve(result)
                });
            } catch (ex){
              console.log('执行execute出错')
              resolve({
                status: -1,
                msg: "执行sql语句出错",
                detail: ex||'执行execute发生未知错误'
              })
            }
          })
        },
        //断开连接
         doRelease(conn) {
          conn.close(
            function (err) {
              if (err) {
                console.log(err.message)
                return
              }
              console.log('oracle数据库断开成功')
            });
        }
        
}

2.引入数据库连接方法

const {connect,execute,doRelease } = require('./oracle.js')

  const DB_CONFIG = {
    user: '', 
    password: '',
    connectString: '' // 数据库地址:{IP:PORT/数据库名称}
  }

3.书写二进制流转化为文件方法

 function toChange(lob){
    let buffer = Buffer.alloc(0);
    lob.setEncoding('binary'); // 设置编码为二进制
    lob.on('data', chunk => {
      buffer = Buffer.concat([buffer, Buffer.from(chunk, 'binary')]);
    });
    lob.on('end', () => {
      // 当所有LOB数据被读取后,将Buffer写入文件

     //保存文件类型根据实际二进制流来进行决定,此处用1.pdf进行示例
      fs.writeFile('1.pdf', buffer, (err) => {
        if (err) {
          console.error('Error saving file:', err);
        } else {
          console.log( name+' has been saved to file successfully.');
        }
        
        // 关闭数据库连接等后续操作...
      });
    });
    lob.on('error', error => {
      console.error('Error reading LOB data:', error);
      // 处理LOB读取错误和关闭数据库连接等后续操作...
    });
  }

4.从数据库查询数据进行转化

  async function select(){
    let conn = await connect(orcal)
    // let sql=`SELECT * FROM  buffer `
    let data = await execute(conn, sql)
  //  console.log(data.rows)
    data.rows.map(row =>{
      const lob=row.hp
      transForm(lob)
     
    })
    console.log(data.rows)
    // doRelease(conn)

  }

5.完整使用方法


const fs = require('fs');
const path = require('path');
const {connect,execute,doRelease } = require('./oracle.js')
 const orcal= {
    user: '', 
    password: '',
    connectString: '' // 数据库地址:{IP:PORT/数据库名称}
  }
 
  async function select(){
    let conn = await connect(orcal)
    // let sql=`SELECT * FROM  buffer `
    let data = await execute(conn, sql)
  //  console.log(data.rows)
    data.rows.map(row =>{
      const lob=row.hp
      transForm(lob)
     
    })
    console.log(data.rows)
    // doRelease(conn)

  }


   function toChange(lob){
    let buffer = Buffer.alloc(0);
    lob.setEncoding('binary'); // 设置编码为二进制
    lob.on('data', chunk => {
      buffer = Buffer.concat([buffer, Buffer.from(chunk, 'binary')]);
    });
    lob.on('end', () => {
      // 当所有LOB数据被读取后,将Buffer写入文件

     //保存文件类型根据实际二进制流来进行决定,此处用1.pdf进行示例
      fs.writeFile('1.pdf', buffer, (err) => {
        if (err) {
          console.error('Error saving file:', err);
        } else {
          console.log( name+' has been saved to file successfully.');
        }
        
        // 关闭数据库连接等后续操作...
      });
    });
    lob.on('error', error => {
      console.error('Error reading LOB data:', error);
      // 处理LOB读取错误和关闭数据库连接等后续操作...
    });
  }

  select()