Socket.IOのチャットアプリでXSS対策まででNode.jsでリアルタイムなチャットアプリの開発を見てきた。
ある程度動作するようになったので、VPSサーバで実際に動かす段階になったので設置した。
前回の記事以降、
メッセージを投稿して、他のブラウザ宛にプッシュする直前でデータベースに保存し、
表示しているブラウザをリロードしたらデータベースに保存しているやりとりを表示する
という機能を付けている。
chatdemo ├── README.md ├── _module │ ├── db.js │ └── init.sql ├── asset │ └── css │ └── style.css ├── node_modules ├── db │ ├── readme │ └── sqlite.db ├── index.js ├── package.json └── template ├── chat.html └── index.html
index.jsがmainでdbに接続する時にdb.jsを読み込む
index.jsでdb.jsを読み込むところのコードは
const db = require('./_module/db.js').init("./db/sqlite.db");
相対パスでdbファイルのパスを指定した。
db.jsは
const sqlite3 = require('sqlite3').verbose(); const SQLiteObject = { init : function(file){ return new sqlite3.Database(file, function(err){ if(err){ console.error(err.message); } }); } } module.exports.init = function(file) { var db = SQLiteObject.init(file); db.run("SELECT * FROM message_table", function(err, res){ if(err){ db.run(require("fs").readFileSync("./_module/init.sql").toString(), function(err){ if (err) { console.error("CREATE ERROR : " + err.message); } }); } }); return db; }
こんな感じ。
index.jsがあるフォルダまで移動して、
$ /home/to/path/ node index.js
であれば、問題なかったのだけれども、
cronをかまして、サーバ再起動時にindex.jsの実行を試みるため、
crontab -eで
@reboot /usr/local/bin/node /home/to/path/index.js
にするとデータベースのファイルのパスがずれるという問題が発生した。
上の@rebootであると、index.jsを実行したディレクトリが異なり、
db.jsで指定しているファイルのパスがずれるらしい。
てっきり、
const db = require('./_module/db.js').init("./db/sqlite.db");
はindex.jsから見ての相対パスだと思っていた。
これだからPHP脳はよろしくないね。
どのディレクトリからindex.jsを実行しても良いように
const db = require(__dirname + '/_module/db.js').init(__dirname + "/db/sqlite.db");
__dirnameからパスを指定して、index.jsが置かれているディレクトリを調べた後、そこからファイルのパスを指定するようにした。
これでデータベースに接続できない問題は回避できた。