どうも僕です。
Node.jsのフレームワークでExpressとはまた別なHapi.jsというものをいま試しています。
このHapi.jsですが、先日アプリを作る用のボイラープレートを準備しているときにバグに遭遇してGlueというライブラリを知ったのでこの知見を共有しておきます。
リポジトリはこちら
https://github.com/boilerplate-garage/hapi-mongo-boilerplate
Glue
ググラビリティの低い名前ですが、hapi.jsのサーバーの設定、起動、プラグインの登録などをワンストップサービスでやるためのライブラリです。
基本的にはHapi.jsも下のコードのように、他のNode.jsフレームワーク同様手続き的にサーバの設定やルーティングのメソッドを順番に呼び出して、最後にstart()
みたいな起動のメソッドを呼び出すかたちです。
var Mongo = require("hapi-mongodb");
var server = new Hapi.Server();
server.connection({
host: "localhost",
port: 8000
});
server.register({
register: Mongo,
options: {
...
}
});
server.route({
...
});
server.start(function(err) {
...
});
hapi.jsではプラグインをの読み込みをしたい時には必ずserver.start()
の前でserver.register()
というメソッドを使わないといけないのですが、内部処理のタイミングがずれてregisterメソッドが呼ばれる前にstartメソッドが走ってしまうみたいなことがあるらしいです。(https://github.com/hapijs/hapi/issues/2516)
まだfixされてないバグらしいので無理やりコールバックなどを使って解決するのもまあありですが、、、複数のプラグインをよみこむときにダルいので、ここはおとなしくGlueを使って以下のように書きましょう。
var Glue = require('glue');
var manifest = {
connections: [
{
host: "localhost",
port: 8000
}
],
registrations: [
{
plugin: {
register: 'hapi-mongodb',
options: {
...
}
}
}
]
};
Glue.compose(manifest, {}, function(err, server) {
if (err) throw err;
server.start(function(err) {
if (err) throw err;
console.log("Server running at: " + server.info.uri);
});
});
ルーティングは別にGlue.compose(...)
のコールバックのなかでやるとよさそうです。
これでGlueが内部的にregistrationsに設定されたプラグインを読み込んでくれるので安心。