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から躓いて解決策分からないと辛いので、誰かの助けになれば。