2013年6月27日木曜日

Node.jsからローカルのSQLServerに接続

最近はNode.jsとDB接続に関して色々調べています。
Node.jsと組み合わせるDBはNosql系のDBが多いですが、今回はSQLServerでやってみました。

MS純正のNode用ドライバは以前から提供されているのですが、日本語での情報がほとんどないため結構苦労しました。

今回はHyper-V上のWindows7にSQLServer2012ExpressとNode.jsをインストールしてみました。

環境:
・Windows7 Pro SP1 32bit
・SQLServer 2012 Express x86版
・Node.js v0.8.25 32bit

その他
・Express 3.3.0 + ejs

また node-sqlserverのコンパイルに必要なのが
・Visual C++ 2010 Express
・Python 2.7

となります。


導入手順

1.Node.jsのダウンロードとインストールをします。今回は0.8系の最新版を選択しました。
  (最新安定版の10.0系ではnode-sqlserverがコンパイルできませんでした。)

2.Visual C++ 2010 ExpressSQLServer2012Expressをダウンロードして、インストールします。
  SQLServerはネットワーク接続できるようにファイアウォール等の設定をしています。

3.Python2.7をダウンロードしてインストールします。

4.SQLServerに「test」データベースを作成し、「T_M商品」テーブルを作成します。
  内容は下の図を参照してください。データも適当に入れておきます。
  



5.C:\に「node」フォルダを作成し、この中にアプリケーションを配置するようにします。

6.Node.jsコマンドプロンプトを起動してからC:\nodeフォルダに移動します。

7.コマンドプロンプトでc:\node> npm install -g express と入力してExpressをインストールします。

8.c:\node> express -e test と入力してtestフォルダにアプリケーションの雛形を作成します。
  testフォルダには以下のように雛形が作成されます。
  

9.package.jsonファイルをエディタで以下のように編集します。

-------------------------------------------------------- 
{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "express": "3.3.0",
    "ejs": "*",
    "node-sqlserver": "*" <------------赤字部分を追加
  }
}
--------------------------------------------------------
このときファイルの文字コードに気をつけましょう。UTF-8で保存しておかないと正常に動作しない可能性があります。以下すべてのファイルの文字コードがUTF-8になるようにしてください。

10.コマンドプロンプト上でtestフォルダに移動してから c:\node\test> npm install と入力する
   と先ほどのpackage.jsonの内容にしたがってインストールが行われます。このとき途中で
   黄色のワーニングメッセージが出るかもしれませんが、コンパイル環境が問題なければ
   そのまま問題なく終了します。

11.問題なくインストールができるとtestフォルダにはnode_modulesフォルダが追加されています。
   

12.node_modules>node-sqlserver>build>Releaseフォルダ内のsqlserver.nodeファイルを
   node_modules>node-sqlserver>libフォルダ内にコピーします。

13.testフォルダにあるapp.jsファイルを以下のように編集します。

途中から
----------------------------------

app.get('/', routes.index);
app.get('/users', user.list);
app.post('/',routes.index);  <-----赤字の部分を追加

----------------------------------
以下は変更なし


14.test>routesフォルダにあるindex.jsファイルを以下のように編集します。

-------------------------------------------------------------------------------
exports.index = function(req, res){
if (req.body.code) {
var sql=require('node-sqlserver');
var cn_str="Driver={SQL Server Native Client 11.0};Server=(local);Database=test;Uid=ユーザー名;Pwd=パスワード;";
sql.query(cn_str,"select * from T_M商品 where 商品コード='" + req.body.code + "'",function(err,rst) {
if (err) {
res.render('index', { title: 'ERROR' });
console.log(err);
}
res.render('index2',{ title: 'Result',
    rst: rst
});
});
}
else {
res.render('index', { title: '検索' });
}
};
-------------------------------------------------------------------------------


15.test>viewsフォルダにあるindex.ejsファイルを以下のように編集します。

-------------------------------------------------------------------------------
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>検索</h1>
      
      <form method="POST" action="/">
        コード検索: <input type="text" name="code" size="50">
        <input type="submit" value="検索実行">
      </form>
  </body>
</html>
-------------------------------------------------------------------------------


16.test>viewsフォルダにindex2.ejsファイルを以下の内容で追加します。

-------------------------------------------------------------------------------
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
 
    <h1>Data</h1>
 
<form method="POST" action="/">
        コード検索: <input type="text" name="code" size="50">
        <input type="submit" value="検索実行">
</form>

<P>

<table border="1">
 <tr>
<th>商品コード</th>
<th>商品名</th>
<th>標準価格</th>
 </tr>

 <% for(var i=0;i<rst.length;i++){ %>
<tr>
 <td> <%= rst[i]['商品コード'] %> </td>
 <td> <%= rst[i]['商品名'] %> </td>
 <td> <%= rst[i]['価格'] %> </td>
</tr>
 <% } %>

</table>
  </body>
</html>
-------------------------------------------------------------------------------


17.アプリケーションを動かしてみます。コマンドプロンプトでc:\node\testフォルダに移動して
   c:\node\test> node app.jsと入力します。
   問題がなければ「Express server listeng on port 3000」と表示されます。


18.ブラウザで「http://localhost:3000/」にアクセスすると以下のように表示されます。


19.試しにコードを入力して検索を実行すると以下のような結果になりました。



まだSelect文のテストしかしていませんが、このようにNode.js+SQLServerの組み合わせでアプリケーションが作成できました。

Node.jsはまだまだ勉強中なのでたいしたサンプルではないですが、少しでも参考になればと思います。


2013年6月26日水曜日