app.post()
| 対応: | Express 4(2014) |
|---|
『Express』の『app.post()』は、指定したパスへのPOSTリクエストを処理するルートを定義するメソッドです。第1引数にパス、第2引数以降にハンドラー関数を渡すことで、そのパスへのPOSTリクエストが届いたときに呼び出す処理を登録できます。フォームの送信やAPIへのデータ投稿など、クライアントからサーバーにデータを渡す場面で主に使われます。
構文
// POSTルートの基本構文 app.post(path, handler); // 複数のハンドラーを指定する場合 app.post(path, middleware, handler);
引数一覧
| 引数 | 型 | 概要 |
|---|---|---|
| path | 文字列 / 正規表現 | ルートを適用するパスを指定します。 |
| handler | 関数 | リクエストを処理するコールバック関数を指定します。req・res・next を受け取ります。 |
ハンドラー関数の引数
| 引数 | 概要 |
|---|---|
| req | リクエストオブジェクトです。リクエストボディ・ヘッダー・URLパラメータなどを取得できます。 |
| res | レスポンスオブジェクトです。クライアントへの応答を送信するメソッドを持ちます。 |
| next | 次のミドルウェアまたはルートハンドラーへ処理を渡す関数です。 |
req.body の取得に必要なミドルウェア
POSTリクエストのボディは、ミドルウェアを登録しないと req.body が undefined になります。送信データの形式に応じて以下のいずれかを app.use() で事前に登録してください。
| ミドルウェア | 対象の Content-Type | 概要 |
|---|---|---|
| express.json() | application/json | JSON形式のリクエストボディを解析して req.body に格納します。 |
| express.urlencoded({ extended: true }) | application/x-www-form-urlencoded | HTMLフォーム送信形式のボディを解析して req.body に格納します。 |
サンプルコード
基本的なPOSTルートの定義から、JSONボディ・フォームデータの取得、バリデーションを挟んだ複数ハンドラーの使い方までを紹介します。
var express = require('express');
var app = express();
// --- ミドルウェアの登録 ---
// JSON形式のリクエストボディを解析するミドルウェアを登録します
app.use(express.json());
// HTMLフォーム送信形式のリクエストボディを解析するミドルウェアを登録します
app.use(express.urlencoded({ extended: true }));
// --- 基本的なPOSTルート ---
// /users へのPOSTリクエストで新規ユーザーを登録します
app.post('/users', function(req, res) {
// req.body でリクエストボディを取得します(express.json() が必要です)
var name = req.body.name;
var email = req.body.email;
console.log('受信したデータ:', name, email);
// ステータスコード 201(Created)でレスポンスを返します
res.status(201).json({ message: '登録しました', name: name, email: email });
});
// --- HTMLフォームからの送信を受け取る ---
// フォームの action="/login" method="POST" に対応するルートです
app.post('/login', function(req, res) {
// express.urlencoded() を登録していれば req.body でフォームデータを取得できます
var username = req.body.username;
var password = req.body.password;
if (username === 'admin' && password === 'secret') {
// 認証成功時はダッシュボードへリダイレクトします
res.redirect('/dashboard');
} else {
// 認証失敗時は 401 を返します
res.status(401).json({ error: 'ユーザー名またはパスワードが正しくありません' });
}
});
// --- URLパラメータとリクエストボディの組み合わせ ---
// /posts/:id/comments に対してコメントを追加します(例: /posts/42/comments)
app.post('/posts/:id/comments', function(req, res) {
// req.params.id でURLパラメータを取得します
var postId = req.params.id;
// req.body.text でコメント本文を取得します
var text = req.body.text;
res.status(201).json({ postId: postId, comment: text });
});
// --- バリデーションを行う複数ハンドラー ---
// 入力値を検証するミドルウェア関数を定義します
function validateUser(req, res, next) {
var name = req.body.name;
var email = req.body.email;
// name と email が両方揃っているか確認します
if (!name || !email) {
// いずれかが欠けている場合は 400 を返して処理を止めます
return res.status(400).json({ error: 'name と email は必須です' });
}
// 検証OKなら next() で次のハンドラーへ処理を渡します
next();
}
// validateUser を通過したリクエストだけが登録処理に到達します
app.post('/members', validateUser, function(req, res) {
res.status(201).json({ message: 'メンバーを登録しました', data: req.body });
});
// --- サーバーの起動 ---
app.listen(3000, function() {
console.log('サーバーを起動しました: http://localhost:3000');
});
概要
『app.post()』はPOSTリクエストを受け取る最も基本的な方法です。req.body にアクセスするには、事前にボディ解析ミドルウェア(express.json() または express.urlencoded())を app.use() で登録しておく必要があります。登録し忘れると req.body が undefined になるため注意してください。
ハンドラーを複数指定するミドルウェアチェーンを活用することで、バリデーションや認証といった共通処理をルートごとに差し込むことができます。next() を呼び出すと次のハンドラーへ処理が移り、呼び出さなければそこで処理が終了します。
アプリケーションの規模が大きくなった場合は、express.Router() を使ってルートをファイルごとに分割すると、コードを整理しやすくなります。GETルートの定義方法については app.get() も参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。