我搜索了Node + Express + Oracle的一个很好的例子。我需要从Oracle视图中读取值以创建对GET操作的响应。
大多数示例不使用“ Express”(我选择的框架),而只是记录数据库信息。以下是一些我发现的最好的东西:from Express,from Oracle 1,from Oracle 2
这里是the one I preferred to base my code on。我喜欢它,因为它包括Express和响应数据的实际操作。可悲的是,它仍然对我不起作用。我想知道问题是什么。
我认为我了解JavaScript语言的异步性质(即回调),并且我开始怀疑我的问题可能与以下问题有关:一个愚蠢的变量名snafu,我的Oracle版本(12c)或源是视图(从另一个架构复制)的事实。
我以许多其他形式(包括异步函数)尝试了以下代码,并且还尝试从节点10切换到11 ...没有任何变化。
任何帮助都将受到欢迎。
从现在开始,代码“有效”,即数据库中的行数据打印在屏幕上,但是Postman(我的测试工具)中的响应为空,没有http错误代码...只是就像在回复之前就已经切断了连接。
请注意注释错误,放置错误的响应代码,如果未注释该代码,则会返回一个响应(由于标头被写入两次,因此会使程序崩溃)。
这是代码。 它基于以下project/file(简化):
var express = require('express');
var oracledb = require('oracledb');
var app = express();
var connAttrs = {
"user": "user",
"password": "pass",
"connectString": "some_host/SCHEMANAME"
}
// Http Method: GET
// URI : /myObj
app.get('/myObj', function (req, res) {
"use strict";
oracledb.getConnection(connAttrs, function (err, connection) {
if (err) {
// Error connecting to DB
res.set('Content-Type', 'application/json');
res.status(500).send(JSON.stringify({
status: 500,
message: "Error connecting to DB",
detailed_message: err.message
}));
return;
}
// THIS works if uncommented. This is obviously the wrong place to put this.
//res.contentType('application/json').status(200);
//res.send("Test.1.2");
connection.execute("SELECT * FROM SCHEMA.SOMEVIEW", {}, {
outFormat: oracledb.OBJECT // Return the result as Object
}, function (err, result) {
if (err) {
res.set('Content-Type', 'application/json');
res.status(500).send(JSON.stringify({
status: 500,
message: "Error getting the user profile",
detailed_message: err.message
}));
} else {
//log first row... THIS WORKS !
console.log(result.rows[0]);
//This does not work, like if "res" could not be touched here !!!
res.contentType('application/json').status(200);
res.send(JSON.stringify(result.rows[0]));
}
// Release the connection
connection.release(
function (err) {
if (err) {
console.error(err.message);
} else {
console.log("GET /myObj: Connection released");
}
});
});
});
});
var server = app.listen(3000, function () {
"use strict";
var host = server.address().address,
port = server.address().port;
console.log(' Server is listening at http://%s:%s', host, port);
});
以下是控制台的表示形式:
{ field1: 'some data',
field2: 'some more data' }
GET /myObj : Connection released