Создать API с узлом js, express и OracleDB - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь создать 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 ]

0 голосов
/ 08 июня 2018

Это потому, что 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, так как соединение уже открыто.

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

0 голосов
/ 08 июня 2018

Я переставил код в соответствии с предложением. Но все равно получил ошибку

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);
0 голосов
/ 08 июня 2018

Вы должны использовать функцию обратного вызова 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 (...." не является необходимой.

...