hapi.jsフレームワークのエラー解消法

node js関連のフレームワーク勉強中。

'use strict';

const Hapi = require('hapi');

const server = new Hapi.Server();
server.connection({ port: 3000, host: 'localhost' });

server.route({
    method: 'GET',
    path: '/',
    handler: function (request, h) {
        reply('Hello, ' + encodeURIComponent(h.params.name));
    }
});

server.start((err) => {

    if (err) {
        throw err;
    }
    console.log(`Server running at: ${server.info.uri}`);
});

公式が配布しているhello worldを動かすと下記エラーが出る

TypeError: server.connection is not a function
    at Object. (/home/ユーザー名/temp/server.js:6:8)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)

下記部分を書き換え

server.connection({ port: 3000, host: 'localhost' });

const server = new Hapi.Server({ port: 3000, host: 'localhost' });

理由としてはhapi v17.0.0から単一サーバーの複数接続のサポートが削除されたため。

さて、これで実行すると下記エラーが出る。

Debug: internal, implementation, error 
    TypeError: reply is not a function
    at handler (/home/ユーザー名/temp/server.js:11:9)
    at module.exports.internals.Manager.execute (/home/ユーザー名/temp/node_modules/hapi/lib/toolkit.js:31:106)
    at Object.internals.handler (/home/ユーザー名/temp/node_modules/hapi/lib/handler.js:46:48)
    at exports.execute (/home/ユーザー名/temp/node_modules/hapi/lib/handler.js:31:36)
    at Request._lifecycle (/home/ユーザー名/temp/node_modules/hapi/lib/request.js:312:68)
    at process._tickCallback (internal/process/next_tick.js:68:7)

これはHapiのバージョン17でAPIが大幅に変更されたかららしい。(https://hapijs.com/api/17.1.0)
仕様変更したら変更前のソース実行時にエラーメッセージ出すとかしてほしいね?

    handler: function (request, h) {
        reply('Hello, ' + encodeURIComponent(h.params.name));
    }

上記を下記に書き換える。

    handler: function(request) {
            return 'Hello, ' + encodeURIComponent(request.params.name);
    }

そして以下が完成形のHello worldソース

'user strict';
  
var Hapi = require('hapi');
const server = new Hapi.Server({ port: 3000, host: 'localhost' });
server.route({
    method: 'GET',
    path: '/{name}',
    handler: function(request) {
        return 'Hello, ' + encodeURIComponent(request.params.name);
    }
});
server.start(function() {
    console.log('Server running at:', server.info.uri);
});

動作確認

node server.js

実行したまま、別画面を開き、実行したサーバー内部から下記コマンドを実行

pc:~$ url -X GET localhost:3000/shibamata
Hello, shibamata

shibamataは適宜変更すればその文字が返る。

日本語の情報少なすぎませんかね?

Hello worldから躓いて解決策分からないと辛いので、誰かの助けになれば。

コメントを残す

メールアドレスが公開されることはありません。