oracledbパッケージのインストールは
npm install oracledb --save
で、出来るのですが、そこまでが超大変でした。
PCが壊れて、Windows10PCに変えてから、Oracleなしになっていたのを
Node.js + Oracle を試したくて、Oracle 12Cをインストール(前は11G? 10G?)
そして、Node.jsの方は、何故かネットに、Oracle接続関連の記事が超少ない
また、パッケージの使い方も、なんか、MySQLと全然違うし、
動くようになったのが奇跡のようです。
■一覧画面
![](https://blogimg.goo.ne.jp/user_image/79/7d/c703f0a583ffb9085ba6f4af1160f69c.jpg)
■登録画面
![](https://blogimg.goo.ne.jp/user_image/01/4a/828dd8385b57b32b177595dc673d1d64.jpg)
■更新画面
![](https://blogimg.goo.ne.jp/user_image/0a/06/bbe26b87ac141ab2fa47252d8deb4d06.jpg)
ただ、Oracleは、コネクションプーリングするんだぞ、出来るぞ、常識だぞ
と書いてあるものの・・・、果たしてどうしたら(コーディングしたら)、それが実現ものやら
さっぱりわからず、相変わらず、どの画面でも、コネクトし直すつくりのままです。
出来る人は、「何もわかっていない」「こいつバカ?」と呆れられるでしょうけど
まあ、動くようになったので、上げる(掲載する)ことにしました。(いいじゃんバカで、フンだ)
Node.jsの仕組みは理解していなくても(出来なくても)、動くものは見様見真似で作れるの見本です。
やらかしている恥ずかしいソースなんだろうなあ(わからんけど)
※以下、ソースのHTMLのタグの< > は、全角に変換してペーストしています。
また、インデントの為、半角スペース2文字を全角スペース1文字に変換しています。
■app.js ============================================
let createError = require('http-errors');
let express = require('express');
let bodyParser = require('body-parser');
let path = require('path');
let cookieParser = require('cookie-parser');
let logger = require('morgan');
//★1 用意したbooklog.jsをロード
let booklogRouter = require('./routes/booklog');
let addbookRouter = require('./routes/addbook');
let updbookRouter = require('./routes/updbook');
let bookinsRouter = require('./routes/bookins');
let bookupdRouter = require('./routes/bookupd');
let app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
//★2 booklog.jsが実行されるアドレスを指定する。
app.use('/booklog', booklogRouter);
app.use('/addbook', addbookRouter);
app.use('/updbook', updbookRouter);
app.use('/bookins', bookinsRouter);
app.use('/bookupd', bookupdRouter);
// catch 404 and forward to error handler
app.use((req, res, next) => {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
■routes/booklog.js =================================
//★1 Expressのライブラリをロード
let express = require('express');
//★2 Routerオブジェクトの作成
let router = express.Router();
/* GET tell page. */
//★3 GETされた時のルート情報を登録する
router.get('/', function(req, res, next) {
let oracledb = require('oracledb');
oracledb.getConnection(
{
user : 'TESTUSER',
password : 'TESTPWD',
connectString : 'localhost/PDBORCL'
},(err, conn) => {
if (err) {
console.error(err.message);
return;
}
var query = "SELECT ISBN13,BookName,Author,to_char(GetDate,'YY-MM-DD') GDATE,State FROM booklog ORDER BY GetDate DESC,ReadDate DESC";
conn.execute(query,(err, result) => {
if (err) {
console.error(err.message);
return;
}
res.render('booklog', { books : result.rows });
});
});
});
//★5 exportsにrouterを設定
module.exports = router;
■routes/addbook.js =================================
//★1 Expressのライブラリをロード
let express = require('express');
//★2 Routerオブジェクトの作成
let router = express.Router();
/* GET tell page. */
//★3 GETされた時のルート情報を登録する
router.get('/',(req, res, next) => {
let hiduke=new Date();
let today = hiduke.getFullYear() + "-" + ("0"+(hiduke.getMonth() + 1)).slice(-2) + "-" + ("0"+hiduke.getDate()).slice(-2);
//★4 テンプレートファイルのレンダリング
res.render('addbook',{ today: today });
});
//★5 exportsにrouterを設定
module.exports = router;
■routes/bookins.js =================================
//★1 Expressのライブラリをロード
let express = require('express');
//★2 Routerオブジェクトの作成
let router = express.Router();
let bodyParser = require('body-parser');
let app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
//★3 POSTで受け取る(formのmethodがpostなので)
router.post('/',(req, res) => {
res.setHeader('Content-Type', 'text/plain');
// INSERT処理
let query = "INSERT INTO booklog VALUES ('";
query += req.body.honban + "','";
query += req.body.amazonno + "','";
query += req.body.honmei + "','";
query += req.body.sakusya + "','";
query += req.body.honya + "','";
query += req.body.bunrui + "',";
if (req.body.hakkoubi == "") {
query += "NULL,";
} else {
query += "to_date('" + req.body.hakkoubi + "','YYYY-MM-DD'),";
}
if (req.body.iritebi == "") {
query += "NULL,";
} else {
query += "to_date('" + req.body.iritebi + "','YYYY-MM-DD'),";
}
if (req.body.yondahi == "") {
query += "NULL,";
} else {
query += "to_date('" + req.body.yondahi + "','YYYY-MM-DD'),";
}
query += req.body.shoyuu + ",";
query += req.body.hondai + ",'";
query += req.body.tosyokan + "','";
query += req.body.gaiyou + "','";
query += req.body.kansou + "','";
query += req.body.jyokyo + "','";
query += req.body.gazoufile + "')";
let oracledb = require('oracledb');
oracledb.getConnection(
{
user : 'TESTUSER',
password : 'TESTPWD',
connectString : 'localhost/PDBORCL'
},(err, conn) => {
if (err) {
console.error(err.message);
return;
}
conn.execute(query,(err, result) => {
if (err) {
console.error(err.message);
return;
}
try {
// COMMIT
conn.commit();
} catch(e) {
console.error(e.message);
}
//★4 トップページにリダイレクト
res.redirect('/booklog');
});
});
});
//★5 exportsにrouterを設定
module.exports = router;
■views/booklog.ejs =================================
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>読書履歴</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/i18n/jquery.ui.datepicker-ja.min.js"></script>
<link type="text/css" rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/overcast/jquery-ui.min.css" />
<script type="text/javascript">
var page = 0;
$(function() {
var max = 10; // 1ページ単位の表示数
function draw() {
$('#page').html(page + 1);
$('tr').hide();
$('tr:lt(4),tr:gt(' + (page * max + 3) + '):lt(' + max + ')').show();
}
$('#prev').click(function() {
if (page > 0) {
page--;
draw();
}
});
$('#next').click(function() {
if (page < ($('tr').size() - 4) / max - 1) {
page++;
draw();
}
});
draw();
});
</script>
<style>
body{
background-color:#80ff80;
background:linear-gradient(to right, #008b00, #80f80f);
font-family: "メイリオ";
font-size:13pt;
}
</style>
</head>
<body>
<table border="0" bgcolor="#FFFFFF" align="center" valign="center" width="95%" height="95%">
<tr valign="top">
<td>
<table width="95%" border="0" align="center" valign="center"
cellspacing="2" cellpadding="2" align="left" style="margin:20px 0px;">
<tr>
<td height="1px" width="155px"> </td>
<td height="1px"> </td>
<td height="1px"> </td>
<td height="1px" width="120px"> </td>
<td height="1px" width="55px"> </td>
</tr>
<tr class="genrestr" bgcolor="#CCCCFF">
<td colspan="3">
<div style="float:left;"><b> 読 書 履 歴 管 理</b></div>
<div style="text-align:center;"><span id="prev"><span id="page"></span><Prev</span> <span id="next">Next></span></div></td>
<td colspan="2" align="center"><a href="http://localhost:3000/addbook">新規追加</a>
</td>
</tr>
<tr align=center bgcolor="#CCCCFF">
<th>ISBN-13</th>
<th>書 名</th>
<th>著 者</th>
<th>入手日</th>
<th>状 況</th>
</tr>
<% books.forEach(function(bookItem) { %>
<tr bgcolor=#E0F1FF>
<td align=center><a href="http://localhost:3000/updbook/<%= bookItem[0] %>">
<%= bookItem[0] %></a></td>
<td><%= bookItem[1] %></td>
<td><%= bookItem[2] %></td>
<td align=center><%= bookItem[3] %></td>
<td align=center><%= bookItem[4] %></td>
</tr>
<% }); %>
</table>
</td>
</tr>
</table>
</body>
</html>
■views/addbook.ejs =================================
//★1 Expressのライブラリをロード
let express = require('express');
//★2 Routerオブジェクトの作成
let router = express.Router();
/* GET tell page. */
//★3 GETされた時のルート情報を登録する
router.get('/',(req, res, next) => {
let hiduke=new Date();
let today = hiduke.getFullYear() + "-" + ("0"+(hiduke.getMonth() + 1)).slice(-2) + "-" + ("0"+hiduke.getDate()).slice(-2);
//★4 テンプレートファイルのレンダリング
res.render('addbook',{ today: today });
});
//★5 exportsにrouterを設定
module.exports = router;
※更新画面のソースは、Node.js/Oracle版 読書履歴管理システム② に続く