Создать API с узлом js, express и OracleDB

Я пытаюсь сделать API с узлом js, express и OracleDB. Мой пример кода в server.js ниже. Я получил следующую ошибку при создании API-интерфейса в интерфейсе командной строки, который Connection.connect не является функцией. Пожалуйста, помогите мне решить эту проблему.

server.js

var express = require('express');
var oracledb = require('oracledb');
var app = express();
var dbConfig = require('./dbconfig.js');

// Get a non-pooled connection

var connection = oracledb.getConnection(
  {
    user          : dbConfig.user,
    password      : dbConfig.password,
    connectString : dbConfig.connectString
  }
);

connection.connect(function(err){
  if(!err) {
    console.log("Database is connected ... nn");   
  } else {  
    console.log("Error connecting database ... nn");   
  }
}); 

app.get("/",function(req,res){    
  connection.query('SELECT * from employees', function(err, rows, fields) {  
    connection.end();
    if (!err) {
      console.log('The solution is: ', rows);
    } else {
      console.log('Error while performing Query.');
    }
  });
});

app.listen(3000);

dbconfig.js

module.exports = {
  user          : "xxx",
  password      : "xxxx",
  connectString : "localhost/XE"
}

3 ответа

Это потому, что getConnection не возвращает соединение, а возвращает обещание. Вы можете настроить промежуточное программное обеспечение Express для подключения каждого запроса к вашему приложению Express:

app.use((req, res, next) => {
  oracledb.getConnection(
  {
    user          : dbConfig.user,
    password      : dbConfig.password,
    connectString : dbConfig.connectString
  },
  (error, conn) => {
    if (err)
    {
      console.log(err);
    }
    else
    {
      req._oracledb = conn;
      next();
    }
});

Теперь, когда пользователь делает запрос, вы можете использовать соединение следующим образом:

app.get('/', (req,res) => { req._oracledb.query('queryString', callback });

Ваша версия будет тогда:

app.get('/',function(req,res){
  req._oracledb.query('SELECT * from employees', function(err, rows, fields) 
  {
    connection.end();
    if (!err)
    {
      console.log('The solution is: ', rows);
    }
    else
    {
      console.log('Error while performing Query.');
    }
  });
});

Connection.connect не требуется после того, как вы получили свое соединение через getConnection, так как соединение уже открыто.

Надеюсь это поможет

Я переставить код, как это было предложено. Но все еще получил ошибку

var express = require('express');
var oracledb = require('oracledb');
var app = express();
var dbConfig = require('./dbconfig.js');

// Get a non-pooled connection
oracledb.getConnection(
  {
    user          : dbConfig.user,
    password      : dbConfig.password,
    connectString : dbConfig.connectString
  },
  function(err, connection) {
    if (err) {
      console.error(err.message);
      return;
    }
            connection.execute(
      // The statement to execute
               app.get("/",function(req,res){
              connection.query('SELECT * from employees', function(err, rows, fields) {
               connection.end();
               if (!err)
                    console.log('The solution is: ', rows);
                else
    console.log('Error while performing Query.');
  });
});
    // The callback function handles the SQL execution results
      function(err, result) {
        if (err) {
          console.error(err.message);
          doRelease(connection);
          return;
        }

        doRelease(connection);
      });
  });


// Note: connections should always be released when not needed
function doRelease(connection) {
  connection.close(
    function(err) {
      if (err) {
        console.error(err.message);
      }
    });
}
app.listen(3000);

Вы должны использовать функцию обратного вызова getConnection следующим образом.

oracledb.getConnection(
    {
        user          : dbConfig.user,
        password      : dbConfig.password,
        connectString : dbConfig.connectString
    }, function(err, connection) {
        if (err) {
            console.log(err)
        } else {
            // DO WHAT YOU NEED ...
        }
    }
)

Вам также следует попытаться вызвать функцию getConnection с ключевым словом "await" следующим образом:

const connection = await oracledb.getConnection(
    {
        user          : dbConfig.user,
        password      : dbConfig.password,
        connectString : dbConfig.connectString
    }
)

Строка "connection.connect(...." не является необходимой).

Другие вопросы по тегам