ウェブエンジニア問題集
第4章

Fastifyのrequestとreply — リクエストを読み、レスポンスを返す

4
この章の目次開く

Fastifyのルートハンドラには、requestreply が渡されます。request は受け取ったHTTPリクエスト、reply は返すHTTPレスポンスを組み立てるためのオブジェクトです。

fastify.get('/profile', async (request, reply) => {
  return { name: 'Taro' };
});
js

request で読める主な値

プロパティ説明
request.paramsパスパラメータ/todos/:idid
request.queryクエリ文字列/todos?page=2page
request.bodyリクエストボディPOST のJSON
request.headersHTTPヘッダーauthorization
request.logリクエスト単位のロガー処理中のログ出力
fastify.post('/todos', async (request) => {
  const title = request.body.title;
  request.log.info({ title }, 'creating todo');
 
  return { title, completed: false };
});
js

FastifyはJSONリクエストを標準で扱えます。ただし、どんな形のJSONでもよいわけではありません。入力値の形はschema validationの章で制限します。

戻り値でレスポンスを返す

async handlerでは、オブジェクトを return するだけでJSONレスポンスになります。

fastify.get('/health', async () => {
  return { ok: true };
});
js

構文: return value

説明
object / arrayJSONとして返される
string文字列として返される
Errorをthrowエラーハンドラへ渡る

戻り値: handlerの戻り値がHTTPレスポンスの本文になります。

Fastifyでは、async handlerなら return { ... } でJSONを返す書き方が自然です。

reply でステータスやヘッダーを指定する

作成成功の 201 や、認証失敗の 401 のようにステータスコードを変えたい場合は reply を使います。

fastify.post('/todos', async (request, reply) => {
  const todo = createTodo(request.body);
  return reply.code(201).send(todo);
});
js

構文: reply.code(statusCode).send(payload)

メソッド引数説明
reply.code()numberHTTPステータスコードを設定する
reply.header()string, valueレスポンスヘッダーを設定する
reply.send()anyレスポンス本文を送信する

戻り値: reply オブジェクト。メソッドチェーンできます。

return reply
  .code(201)
  .header('location', `/todos/${todo.id}`)
  .send(todo);
js

404を返す

存在しないデータを返すときは、404 Not Found を明示します。

fastify.get('/todos/:id', async (request, reply) => {
  const id = Number(request.params.id);
  const todo = todos.find((item) => item.id === id);
 
  if (!todo) {
    return reply.code(404).send({
      error: {
        code: 'TODO_NOT_FOUND',
        message: 'Todoが見つかりません',
      },
    });
  }
 
  return todo;
});
js

エラー時のレスポンス形式は、API全体で揃えるとクライアント側が扱いやすくなります。詳しくはエラーハンドリングの章で扱います。

返す情報を選択する人
正常系と異常系で、返すステータスとJSONの形を分けて考える

参考リンク

次章では、Fastifyらしさの中心であるJSON Schemaによる入力検証とレスポンス定義を学びます。

Node.jsクイズに挑戦するリクエスト、レスポンス、ステータスコードの基本をクイズで確認しよう