如何从使用node-oracledb的查询返回回调

How return callback from a query made with node-oracledb?

本文关键字:查询 返回 回调 node-oracledb      更新时间:2023-09-26

以下代码与node-oracledb GitHub示例中使用的代码相同,称为select1.js。我只是稍微修改了一下

module.exports = function()  {
    var oracledb = require('oracledb');
    var dbConfig = require('./dbconfig.js');
    this.queryDB = function (query) {
        oracledb.getConnection({
            user            : dbConfig.user,
            password        : dbConfig.password,
            connectString   : dbConfig.connectString
        }, function(err, connection) {
            if (err) {
                console.error(err.message);
                return;
            }
            connection.execute(query, function(err, result) {
                if (err) {
                    console.error(err.message);
                    doRelease(connection);
                    return;
                }
                console.log(result.metaData);
                console.log(result.rows);
                doRelease(connection);
                return result.rows
            });
        });
        function doRelease(connection) {
            connection.release(function(err) {
                if (err) {
                    console.error(err.message);
                }
            });
        }
    }
}

可以这样使用:

require('./dbquery.js')();
console.log(queryDB("SELECT * FROM users"));

我希望看到与"console.log(result.rows);"行相同的2D矩阵(表示表)。但是"console.log(queryDB("SELECT * FROM users"));"返回"undefined"。

我如何返回我在回调函数中得到的值?

我试着在开头添加一个变量X,像这样:

module.exports = function()  {
    var oracledb = require('oracledb');
    var dbConfig = require('./dbconfig.js');
    this.queryDB = function (query) {
        var X;
        oracledb.getConnection({
            user            : dbConfig.user,
            password        : dbConfig.password,
            connectString   : dbConfig.connectString
        }, function(err, connection) {
            if (err) {
                console.error(err.message);
                return;
            }
            connection.execute(query, function(err, result) {
                if (err) {
                    console.error(err.message);
                    doRelease(connection);
                    return;
                }
                console.log(result.metaData);
                console.log(result.rows);
                doRelease(connection);
                X = result.rows
            });
        });
        function doRelease(connection) {
            connection.release(function(err) {
                if (err) {
                    console.error(err.message);
                }
            });
        }
        return X;
    }
}

但这仍然没有定义。我怎样才能做到这一点呢?

它在async性质下运行。你可以用callbackpromises来解它。你不能得到这样的值

传递callback并返回回调

module.exports = function(callback) {//pass callback function and return with this
  var oracledb = require('oracledb');
  var dbConfig = require('./dbconfig.js');
  this.queryDB = function(query,callback) {
    oracledb.getConnection({
      user: dbConfig.user,
      password: dbConfig.password,
      connectString: dbConfig.connectString
    }, function(err, connection) {
      if (err) {
        console.error(err.message);
        return callback(err);
      }
      connection.execute(query, function(err, result) {
        if (err) {
          console.error(err.message);
          doRelease(connection);
          return;
        }
        console.log(result.metaData);
        console.log(result.rows);
        doRelease(connection);
        return callback(null, result.rows)
      });
    });
    function doRelease(connection) {
      connection.release(function(err) {
        if (err) {
          console.error(err.message);
          return callback(err);
        }
      });
    }
  };
};