LoginSignup
4
6

More than 5 years have passed since last update.

Hapi.jsで開発するときにはGlueをつかうとよさそう

Last updated at Posted at 2016-01-31

どうも僕です。
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に設定されたプラグインを読み込んでくれるので安心。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6