Создать 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(...." не является необходимой).