作成日: 2023-10-08T15:43:58.468Z
前回はログイン部分の画面を作成しました。今回は実際にバックエンドと連携して新規登録をしてみたいと思います。
事前準備として以前に作ったバックエンドのローカルサーバーを立ち上げておきましょう。
立ち上げておかないとリクエストすら送れない状態になります。
既に登録されているユーザであればアラートが出て
まだ登録されていないユーザを登録してみると、
このように登録した名前が出力される。
signup:{
title:"新規登録",
instruction:"名前、メールアドレス、パスワードを入力してください。",
validationCheck:{
required:"この項目は必須です",
email:"メールアドレスの形式が違います",
password:"パスワードが短いです"
},
attribute:{
name:{
labelName:"name",
},
email:{
labelName:"email",
typeName:"email",
},
password:{
labelName:"password",
typeName:"password",
}
},
buttonTitle:"新規登録する",
gobackBotton:"ホームに戻る",
alradyHaveAccount:"データはもうすでにあります",/*追加*/
},
APIのURLをlinkName.tsに追加します。
signupApi:"http://localhost:8080/auth/signup",
以下の型を追加します。
//新規登録でのレスポンスの型
export type resAuthData={
name:string;
email:string;
password:string;
id:string;
}
ではAPIを取得するコードを書いていきます。「api」フォルダの中にauth.tsを作りましょう。
処理の流れとしては、
です。実際のコードを見ていきましょう。
import ja from "@/shared/ja";
import linkName from "@/shared/linkName";
import { resAuthData, signupType } from "@/shared/type";
//signupのAPI送信
export const signup=async(data:signupType)=>{
const res=await fetch(linkName.signupApi,{
method:"POST",
headers:{
'Content-Type':'application/json'
},
body:JSON.stringify(data)
});
const resJson=await res.json()
if(resJson.data===ja.signup.alradyHaveAccount){
return [];
}else{
return resJson.data as resAuthData[];
}
}
APIを叩くときはfetch関数を使います。こいつは非同期処理になるのでasync/awaitを使いましょう。
後は上記の処理のままのコードを書いています。
遷移先はtodoのページになるため「app」フォルダに「todo」を作っておきpage.tsxに以下のコードを書いておきます。
'use client'
import { useSearchParams } from "next/navigation";
const Todo = () => {
const searchParams=useSearchParams();
const name=searchParams.get('name');
const id=searchParams.get('id');
return (
<div>
こんにちは。{name}さん。
</div>
);
}
export default Todo;
ここのコードではqueryパラメータを読み取っています。idとnameをqueryパラメータとここではしています。queryパラメータというのはよくGoogle検索に使われているやつです。APIで送られてきたユーザ情報を受け取ってidとnameをqueryパラメータとして渡しそれを受け取って入力した名前を画面に出力します。本来であればJWTというものを使ったりuseContextなどを使って管理したりとするのですが、今回はゆるゆるのセキュリティですがこのやり方でいきたいと思います。
「signup」フォルダの「signupForm」フォルダのindex.tsxにてonSubmit関数が存在すると思うがそこを書き換える。
以下のように書き換える。
const onSubmit=async(data:signupType)=>{ const res:resAuthData[]=await signup(data); if(res.length===0){ alert(ja.signup.alradyHaveAccount) }else{ router.push(`/todo?id=${res[0].id}&name=${res[0].name}`) } };
処理としては
です。
これで上記画像のような結果になるのではないでしょうか?
APIとの連携はどうでしたか?
このようにフロントとバックエンドの繋ぎの部分をやっていくとバックエンドの方が何をしているのかがわかってくるはずです。
ということで次回はログインの方をやっていきましょう。
実際にログインしてみる。