
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が置かれているディレクトリを調べた後、そこからファイルのパスを指定するようにした。
これでデータベースに接続できない問題は回避できた。





