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

にするとデータベースのファイルのパスがずれるという問題が発生した。

SOY CMSのサイトのバックアップをDropboxで行う


上の@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が置かれているディレクトリを調べた後、そこからファイルのパスを指定するようにした。


これでデータベースに接続できない問題は回避できた。