Re:SALOON & VBA

Node.js/Oracle版 読書履歴管理システム

MySQL版を、Oracle版に書き直してみました。

oracledbパッケージのインストールは

npm install oracledb --save

で、出来るのですが、そこまでが超大変でした。

PCが壊れて、Windows10PCに変えてから、Oracleなしになっていたのを
Node.js + Oracle を試したくて、Oracle 12Cをインストール(前は11G? 10G?)
そして、Node.jsの方は、何故かネットに、Oracle接続関連の記事が超少ない
また、パッケージの使い方も、なんか、MySQLと全然違うし、
動くようになったのが奇跡のようです。

■一覧画面


■登録画面


■更新画面


ただ、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版 読書履歴管理システム② に続く
名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

※ブログ作成者から承認されるまでコメントは反映されません。

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最新の画像もっと見る

最近の「Node.js他(Python)」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事