end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

(javascript) node.js + express による mysql への接続

先日までに vue.js に触れてみましたが、 サーバ側の処理も javascript(node.js)で試したくなりました。 (そうすれば、クライアント側もサーバ側も javascriptで統一できますからね)

そこで、node.js + express による mysql への接続を実装してみました。以下

試した感想

簡単な実装はできますが、javaやperl、pythonと比較すると、
node.jsはmoduleや日本語情報が、まだまだ少ないので、
現時点では、サーバ側の実装は、これまで通り、javaやperl、python を利用した方が良さそう。

という感じ

下準備

## ↓ express-generator とは spring boot のようなものと理解してます
$ sudo /usr/bin/npm install --global express-generator

## 上記により、/usr/bin/express が利用できますので
## projectを template engine=ejsで作成
$ /usr/bin/express --view=ejs node_exp_gen_mysql
  create : node_exp_gen_mysql/
     <略>
   create : node_exp_gen_mysql/public/javascripts/
   create : node_exp_gen_mysql/bin/www

   change directory:
     $ cd node_exp_gen_mysql
   install dependencies:
     $ npm install
   run the app:
     $ DEBUG=node-exp-gen-mysql:* npm start

## 上記により、 package.json が作成されていますので
## npm install により、package.json 内にある依存moduleをinstall
$ cd node_exp_gen_mysql
$ npm install
node-exp-gen-mysql@0.0.0 /home/end0tknr/tmp/node_exp_gen_mysql
├─┬ cookie-parser@1.4.4 
:  :  
├── ejs@2.6.2 
├─┬ express@4.16.4 
│  ├─┬ accepts@1.3.7 
:  :  :


## 試しにnpm startにより起動し、ブラウザでアクセス( http://cent76.a5.jp:3000/ )
## start というコマンドは package.json 内に定義されています。
$ npm start

## ctrl+cでサーバ停止
$ ^C

## mysql moduleのinstall

$ /home/end0tknr/tmp/node_exp_gen_mysql
$ npm install --save mysql
node-exp-gen-mysql@0.0.0 /home/end0tknr/tmp/node_exp_gen_mysql
└─┬ mysql@2.17.1 
    ├── bignumber.js@7.2.1 
    ├─┬ readable-stream@2.3.6 
    │  ├── core-util-is@1.0.2 
    │  ├── isarray@1.0.0 
    │  ├── process-nextick-args@2.0.1 
    │  ├── string_decoder@1.1.1 
    │  └── util-deprecate@1.0.2 
    └── sqlstring@2.3.1 

実装したsrc (defaultからの変更分のみ)

routes/index.js

var express = require('express');
var router = express.Router();

var mysql      = require('mysql');
var dbh = mysql.createConnection({
    host     : 'localhost',
    user     : 'root',
    password : '',
    database : 'test_db'
});

/* GET home page. */
router.get('/', function(req, res, next) {

    dbh.connect();
    var sql =
    'select tei_name,build_address from anken where tei_name like ? limit 5';

    var render_data = { title: 'nodejs express mysql test',
            db_results: []};

    dbh.query(sql, ['%鈴木%'], function (error, results, fields) {

    if (error) throw error;
    render_data['db_results'] = results;
    console.log(results);
    
    res.render('index', render_data);
    });

    dbh.end();
});

module.exports = router;

views/index.ejs

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>

    <table>
      <tbody>
      <% for(var i in db_results) { %>
      <tr>
        <% var obj = db_results[i]; %>
        <th><%= obj.tei_name %></th>
        <td><%= obj.build_address %></td>
      </tr>
      <% } %>
      </tbody>
    </table>
    <p>Welcome to <%= title %></p>
  </body>
</html>