今回はAPIルートを使って簡単なバックエンドを作ります.
前回を参照
Next.jsが提供する機能でAPIエンドポイントが作れます. まずpagesフォルダ以下にapiというフォルダを作ります. この中にハンドラを定義します. フォルダのパスがそのままAPIのパスとして使われます.
例えばapi/quizzes.jsなら
http://localhost:3000/api/quizzes
としてアクセスできます.
ハンドラはリクエストを受け取ってレスポンスを返すような非同期関数です.
const handler = async (req, res) => {
// do something with local file system, database, or external apis
}
これをファイルの末尾でエクスポートしておくだけです.
export default handler
api/quizzesエンドポイントではクイズの取得, クイズの作成ができます. これらはHTTPメソッドの違いで区別されるわけです. メソッドはreq.methodで参照できます.
export default function handler(req, res) {
if (req.method === 'POST') {
// Process a POST request
} else {
// Handle any other HTTP method
}
}
これは少しめんどくさいです. next-connectを使うともう少し整理した書き方が出来るようになります.
DgraphへのアクセスはJavaScriptクライアントのdgraph-js-httpを使います.
npm i dgraph-js-http
import * as dgraph from 'dgraph-js-http'
その前にDgraph ZeroのURLを.env.localに保存しておきましょう.
DGRAPH_URL='http://localhost:8080/'
これを使いクライアントを作成します. DgraphClientStubは第一引数にアドレスを取ります.
function DgraphClientStub(addr, stubConfig, options) {
...
}
このインスタンスをDgraphClientに渡します.
const clientStub = new dgraph.DgraphClientStub(process.env.DGRAPH_URL)
const dgraphClient = new dgraph.DgraphClient(clientStub)
実際にデータをやり取りするにはHTTPメソッドの指定が必要です. またその度にクライアントを作成するのも面倒です. next-connectを使うとHTTPメソッドごとのハンドラのヒモ付やDBクライアント取得処理をミドルウェア化できます. 内部的にはtrouterという機能を使っているようです.
npm i next-connect
middlware/database.js
import * as dgraph from 'dgraph-js-http'
import nextConnect from 'next-connect';
const clientStub = new dgraph.DgraphClientStub(process.env.DGRAPH_URL)
const dgraphClient = new dgraph.DgraphClient(clientStub)
async function database(req, res, next) {
req.dbClient = dgraphClient;
return next();
}
const middleware = nextConnect();
middleware.use(database);
export default middleware;
dbClientとして参照出来るようになります. ハンドラ側ではミドルウェアを利用するようにします.
import nextConnect from 'next-connect';
import middleware from '../../../middleware/database';
const handler = nextConnect();
handler.use(middleware);
export default handler;
各メソッド毎にハンドラを登録できるようになりました.
const getHandler = async (req, res) => { /*...*/ }
handler.get(getHandler)
これで
GET http://localhost:8080/api/quizzes
POST http://localhost:8080/api/quizzes
を使い分けることができるようになりました.
reqから参照できます.
const getQuizzes = async (req, res) => {
const client = req.dbClient
}
next-connectを使うことでHTTPメソッドとハンドラの関係性が記述しやすくなったかなと思います.
次回を参照
Create a Next.js App with a MySQL Database That Builds and Deploys with Vercel
Building Modern Applications with Next.js and MongoDB
Next.jsのAPI Routerを使ってMongoDBからデータを引っ張ってくるAPIを作る(next-connectを利用したミドルウェアも)
Androidアプリ開発者を目指しています. 興味あることリスト: https://t.co/ew3bb6grdJ Github: https://t.co/9btqysHqWr Qiita: https://t.co/ZVRhjouauX
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント