第4章
Fastifyのrequestとreply — リクエストを読み、レスポンスを返す
約4分
Fastifyのルートハンドラには、request と reply が渡されます。request は受け取ったHTTPリクエスト、reply は返すHTTPレスポンスを組み立てるためのオブジェクトです。
fastify.get('/profile', async (request, reply) => {
return { name: 'Taro' };
});js
request で読める主な値
| プロパティ | 説明 | 例 |
|---|---|---|
request.params | パスパラメータ | /todos/:id の id |
request.query | クエリ文字列 | /todos?page=2 の page |
request.body | リクエストボディ | POST のJSON |
request.headers | HTTPヘッダー | 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 / array | JSONとして返される |
| 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() | number | HTTPステータスコードを設定する |
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全体で揃えるとクライアント側が扱いやすくなります。詳しくはエラーハンドリングの章で扱います。

参考リンク
次章では、Fastifyらしさの中心であるJSON Schemaによる入力検証とレスポンス定義を学びます。
Node.jsクイズに挑戦するリクエスト、レスポンス、ステータスコードの基本をクイズで確認しよう
