当時の状況
POSTリクエストからデータを受け取り、drogonのDB接続機能をつかって、mariaDBにデータを格納する部分をつくっていたところです。
drogonの情報はあんまり見られない(特にmariaDBとは)のでここにまとめてみます。間違ってたらごめんなさい。
環境
OS :Debian10 (chromebookのlinuxモード)
DB :mariadb Ver 15.1
開発言語 :c++(フレームワークはdrogon)
ファイアウォール :ufw
エラーに詰まるまでの経緯
こちらのチュートリアルが充実していて大いに参考にしました。
https://github.com/drogonframework/drogon/wiki/ENG-08-1-DataBase-DbClient
c++でありながら、さすがフレームワーク。これによると、データベースの接続はこの一文だけ書けば、接続が済んだオブジェクトを提供してくれるみたいです。
auto clientPtr = drogon::app().getDbClient();
//↑これでデータベースに接続する
上記のgetDbClient()と簡単なSQLを実行するプログラムを書いて、buildディレクトリでコンパイル。アクセスしてみて返却値が得られれば成功のはずでしたが。。
FATAL no database is supported by drogon
drogonが接続先のデータベースを見つけてないんですね。それはあるかもな〜ってなります。でも、じゃあどうやってdrogonに認識させるのかわからない。
答えはマニュアルのインストール要件の箇所に書いてました。
https://github.com/drogonframework/drogon/wiki/ENG-02-Installation#System-Requirements
(日本語訳を↓に引用)
どうやらdrogonを再インストールしないといけないらしいです。
また、mariadbとの接続をサポートするライブラリもインストールされてなかったので、まずこちらからやりました。
sudo apt install libmariadbclient-de
これが完了してるとdrogon再インストール時にこんな文章が出てきます。
おっ、読み込んだって!これは期待♬
Lost connection to MySQL server at 'handshake: reading initial communication packet'
再びdrogon::app().getDbClient()を使ってDB接続を試みます。今度は「接続が切られた」とエラーが出ました。
※[余談]しかも、この状態になるとプロセスはctrl+Cを押しても終了できなくなるので厄介です。(http接続の途中なので切れないとか?)仕方なくより強力なプロセスの終了を調べにひとっ走りしてきたので↓を参照
ps -aux | grep [実行ファイル名]
#私の場合はbackBookというなのでこれで検索しました
kill -9 [プロセス番号]
#このプロセスは強力なので-9オプション(SIGKILL)をつけないところせない
さて、コネクションの問題ということなので、まずはconfig.jsonを見直します。間違えてもピンポイントで指摘してもらえないやつなのでややこしい思いをしました...。mariaDB用の正しい形式は以下のとおりです。
"db_clients": [
{
"rdbms": "mysql",
"host": "localhost",
"port": 3306,
//mariadbのポート番号はこれらしい
"dbname": "databasename",
"user": "username",
//最初localhost@usernameにしていた..
"passwd": "ユーザーのログインパスワード",
また、DBのログイン情報を事前に仕込んでおくファイルとして、config.jsonが設置されています。実はデフォルトではコメントアウトされてて読み込まれなかったり、パスが違う(なぜ??)ので直しておきましょう
#include <drogon/drogon.h>
using namespace drogon;
int main()
{
/*コメントがずらっとならんでる*/
LOG_INFO << "Server running on 127.0.0.1:8848";
app().loadConfigFile("../config.json");
//↑ここです
app().addListener("127.0.0.1", 8848).run();
}
たぶん、ここまでくれば接続できる人が多い気がしますが、
それでもなお接続できないとしたら、ファイアウォールの設定を見直すべきかもしれません。
筆者はufwを使用しているのでufwnの設定を残します
sudo ufw allow from 127.0.0.1
#↑drogonで使用しているアドレス(main.ccで設定中)を許可する。
sudo ufw enable
そうこうしている内に接続が確立しておりました。