2013年8月14日水曜日

[node.js] Windows7 + Node.js + Express + SQLite3

Windows7 に Node.js + Express + SQLite3 環境を作ったのですが、SQLite3 のインストールでつまづいたのでメモ。

【前準備 その1】 Python インストール (※SQLite インストールに必要)
http://www.python.jp/download/ から python-2.7.5.amd64.msi を取得し、「C:\Python27」にインストール後、パスを通す

【前準備 その2】 「vcvarsall.bat」をインストール (※SQLite インストールに必要)
当該バッチは VS2010 と互換性のあるバージョンの Windows SDK についてくるようです。僕は VisualStudio 2010 をインストールしていたので下記フォルダにありました。
「C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat」

【前準備 追記】
「vcvarsall.bat」を使ったのは、
$ npm install sqlite3
を OS 付属のコマンドプロンプトを使って実行すると↓みたいなエラーが出てうまく行かなかったんだけれども「vcvarsall.bat」を使ったら解決したよ。っていう人がいたから。でも、複数回コマンドプロンプトから試してみたらうまく行った。「vcvarsall.bat」は特に必要ないのかしらん... (汗) Python はないとエラーになるはず (`・ω・´)
...
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(5
74,5): error MSB6006: "mt.exe" はコード 31 を伴って終了しました。 [C:\Users\higu
chi_yuki\Dropb
ox\node.js\testapp\node_modules\sqlite3\build\node_sqlite3.vcxproj]
gyp ERR! build error
gyp ERR! stack Error: `c:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe
` failed with exit code: 1
...

1. Node.js をインストール
http://nodejs.org/download/ から node-v0.10.15-x64.msi を取得して実行

2. Express をグローバル環境に (-g オプション追加) インストール
$ npm install -g express

3. アプリケーションフォルダ「sample」を作成し、初期化
(※アプリケーションフォルダの親フォルダで実行のこと)
$ mkdir sample
$ express -e sample
$ cd sample && npm install

4. 「Visual Studio コマンド プロンプト *1」を利用して SQLite3 インストール
$ npm install sqlite3
*1 ... 「Visual Studio コマンド プロンプト」は、僕が VisualStudio 2010 をインストールしたことによる表現です。実体は「前準備 その2」の「vcvarsall.bat」です。

起動方法は、[スタート] - [すべてのプログラム] - [Microsoft Visual Studio 2010] - [Visual Studio Tools] - [Visual Studio コマンド プロンプト (2010)]です。

成功するとこんなかんじになります。


5. SQLite のテーブルから読みだした内容を表示するサンプルをば

SQLite のファイルを準備します。ここでは PupSQLite を使って sample.db を作りました。

フォルダの様子はこんなかんじ。


sample/app.jp
var express = require('express');
var routes = require('./routes');
var http = require('http');
var path = require('path');

var app = express();

app.set('port', process.env.PORT || 1234);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

app.get('/', routes.index);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});
sample/routes/index.js
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('sample.db');

exports.index = function(req, res){
  db.serialize(function(){
    db.all("select * from messages", function(err, rows){
      if (!err) {
        res.render('index', {
          title: 'Node.js + Express + SQLite3',
          list: rows,
        });
      }
    });
  });
};
sample/views/index.ejs
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <ul>
    <% list.forEach(function(message){ %>
      <li><%= message.content %></li>
    <% }) %>
    </ul>
  </body>
</html>

実行結果はこんなかんじ。


6. 参考にさせてもらったサイト

なんてステキなんだろう Node.js ... Raspberry Pi にも入れてみたいです!