最近はWindows上でnodejs開発しています。
そうしていると困っちゃうことが稀によくあって大変です。
さて、今回困ったことはこちら↓↓
困ったこと
Windows上でnodejs+mysqlを使ってRaspberryPi上のMySQLサーバーにアクセスしようとしたらアクセスできなかった!
環境
Windows10 Home
node:version 8.11.1
mysql(node_module):version 2.15.0
RaspberryPi(raspbian-jessie)
MySQLサーバー:Ver 14.14 Distrib 5.5.59, for debian-linux-gnu (armv7l) using readline 6.3
詳細
RaspberryPi上にMySQLのサーバーがすでにあったらやっぱりそれを使いたくなりますよね。
そこで外部からアクセスするためにMySQLサーバーにログインして以下のコマンドで設定をします1。
> grant all privileges on `db_name`.* to 'user_name'@'%' identified by 'password';
この設定をして以下のプログラムでWindowsから接続してみました。
var mysql = require('mysql');
var mysqlOptions = {
host: 'mysqlサーバーのIPアドレス',
user: 'user_name',
password: 'password',
database: 'db_name'
};
var db = mysql.createConnection(mysqlOptions);
new Promise((resolve, reject) => {
db.connect((err) => {
if (err) {
console.log('connection failed');
return reject(err);
}
return resolve();
});
}).then(() => {
return new Promise((resolve, reject) => {
db.query("select * from db_name;", (err, res, fields) => {
if (err) {
return reject(err);
}
console.log(res[0]);
return resolve();
});
});
}).then(() => {
db.end();
}).catch((err) => {
console.log(err);
});
LinuxOSからの接続を試していないのでこれだけで行けるのかはわからないのですが、Windowsではgrantコマンドによる設定だけではダメでした。
具体的には以下のエラーが返ってきます。
PS C:\hoge\fuga> node .\test_mysql.js
connection failed
{ Error: connect ECONNREFUSED データベースのIPアドレス:3306
at Object._errnoException (util.js:1022:11)
at _exceptionWithHostPort (util.js:1044:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1198:14)
--------------------
at Protocol._enqueue (C:\path\to\program\node_modules\mysql\lib\protocol\Protocol.js:145:48)
at Protocol.handshake (C:\path\to\program\node_modules\mysql\lib\protocol\Protocol.js:52:23)
at Connection.connect (C:\path\to\program\node_modules\mysql\lib\Connection.js:130:18)
at Promise (C:\path\to\program\test_mysql.js:5:6)
at new Promise (<anonymous>)
at Object.<anonymous> (C:\path\to\program\test_mysql.js:9:1)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
code: 'ECONNREFUSED',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: 'データベースのIPアドレス',
port: 3306,
fatal: true }
んーーーなんなんだーこれはー!!!
TCP的なエラーだしポートがうんぬんという話を見つけてファイヤウォールのポートを開放してみましたが、同じエラーが返ってきてました2。
キレそう
解決策
MySQLサーバーのlisten設定を変える必要がありました3。
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address = 127.0.0.1
bind-address = 0.0.0.0 ←これに変更
そしてMySQLサーバーを再起動
$ sudo /etc/init.d/mysql restart
これで無事WindowsからRaspberryPi上のMySQLサーバーに接続できました!