フロントエンド初心者がVercel公式フルスタックアプリチュートリアルをやってみた

モダンフロントエンドのフレームワークを学びたての元SEがVercel公式のフルスタックアプリ作成のチュートリアルに沿ってWebアプリ作成+Vercelへのデプロイまでしてみました。チュートリアルといいつつも、エラーが出たり、途中で省かれている工程などがあったりと、初心者には辛いところがあるなということで、躓いたところをまとめてみたいと思います。
また、技術系サイトへの投稿は初なので読みづらいところなどあるかもしれませんがご容赦ください。
他の初心者エンジニアの一助になれば幸いです。

## 経験値
 VB.net / VBA / OracleSLQ / GAS / Flutter

## 環境
* Windows11
* VSCode

## 実施日
 2023/08/06

## 成果物
[blogr-nextjs-prisma-1](https://github.com/Cyanoptilas/blogr-nextjs-prisma-1/)
※もろもろの都合で"-1"が付加されています。

## 対象チュートリアル
 How to Build a Fullstack App with Next.js, Prisma, and Vercel Postgres

https://vercel.com/guides/nextjs-prisma-postgres

## 事前にやったこと
* UdemyのReactガイドを受講
具体的には、下記講座のreduxのセクション以外を受講しました。
https://www.udemy.com/course/react-complete-guide/
Flutterを触ったことがありましたが、同じノリでコーディングするんだなあと思いました。
* 下記企業HPの模倣
[SmartHR](https://smarthr.jp/)
Next.js(React+TypeScript)、Chakra Uiを使用して、デザインと挙動が全く同じになるようにコードを書いて、それを知り合いの凄腕スーパーエンジニアの方にレビューしてもらいました。
この段階でフロントのコードはだいぶ書けるようになったかと思います。

## 実際にやっていく
### Step1
コマンドを実行してプロジェクトを作成するだけなので問題ないでしょう。

### Step2
Vercel上にDBサーバーを作成します。ここもしっかり読みながら勧めていけば問題ないでしょう。vercelのインストールと、`vercel link` でプロジェクトとアカウントを紐付けることを忘れずにしましょう。環境によっては、vercelコマンドを実行するためにWindows上のスクリプト実行権限(ポリシー)を変更する必要があるかもしれないです。

### Step3
Prismaという便利ツールをインストールします。このチュートリアルで初めて知った技術で、今までOracleSQLしか触ったことがなかったので、SQL文を一切書かずにSQLのDBを使えることにとても感動しました…。
説明には書いていませんが、`schema.prisma`ファイルはルート直下に`prisma`フォルダを作成してそこに配置します。こういうところがちょいちょいあるのでとても不親切ですね…。`prisma`系のコマンドは今後も使うことがあるので覚えておきましょう。
また、`npx prisma ...`のコマンド実行時は、`.env`ファイルしか参照していないようなので、`POSTGRES_PRISMA_URL`は別途.envファイルを作成してそこに記載します。

### Step4/Step5
こちらも、記載の通りにコマンドの実行、ファイルの作成をすれば問題ないかと思います。

### Step6/Step7
まずNextAuthのインストールでつまずきます。他のモジュールのバージョンと整合性が取れていない旨のエラーが出るので、ひとまずエラー文の通りにnext@12.2.5をインストールすれば、`npm install next-auth@4 @next-auth/prisma-adapter`は完了するかと思います。サーバーを再起動して、無事に動くことを確認。
ヘッダーのLogInから`Sign in with Github`を押すと、またエラーが。`ERR_SSL_PROTOCOL_ERROR`が出て、なぜかhttpsでコールバックされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249463/7a588905-7715-213e-de0c-49731994ca46.png)
これは、nextを最新化すると解消されるので、下記3つアップデートしましょう。
`npm i react@latest`
`npm i react-dom@latest`
`npm i next@latest`
完了後、サーバー再起動し、再度`Sign in with Github`を押すと無事にログイン完了！ヘッダー部分にアカウントの情報が表示されています。

### Step8/Step9
チュートリアル通りに最後まで進め、試しに投稿してみると、`author: { connect: { email: session?.user?.email } },`のemailがnullとなっていまい、エラーとなります。emailがnullなのはsessionがundifinedとなっているのが原因ですが、さらにこれの原因は以下のコードでなぜかsessionが取得できていないためのようです(console.logで確認)。
なので、`getSession`を`getServerSession`に置き換えましょう。こちらの情報が参考になります。

https://zenn.dev/ohtasoji/articles/b38da473a59749

```diff_tsx
import { getServerSession } from "next-auth";
import { options } from "../../api/auth/[...nextauth]";

- const session = await getSession({ req });
+ const session = await getServerSession(req, res, options);
```

再度投稿すると、うまくいきました。

### Step10/Step11
このあたりもチュートリアル通りに勧めていけば問題ないかと思います。

### Step12
チュートリアルをよく読みながら進めましょう。Githubにプッシュ(プロジェクト作成)後、Vercelサイト上でDeploy(プロジェクトのImport)を実行すると、案の定エラー…。

```console
Failed to compile.
./node_modules/@prisma/client/runtime/library.d.ts:1224:35
Type error: '?' expected.
...
```

TypeScriptでエラーが出ているようなので、下記コマンドで最新化。
`npm i typescript@latest`

再度Deployすると、またエラーが発生。
```console
PrismaClientInitializationError: Prisma has detected that this project was built on
Vercel, which caches dependencies. This leads to an outdated Prisma Client because
Prisma's auto-generation isn't triggered. To fix this, make sure to run the `prisma 
generate` command during the build process.
```

これはPrisma公式に記載があったのでその通りに対応します。何通りか方法があります。

https://www.prisma.io/docs/guides/other/troubleshooting-orm/help-articles/vercel-caching-issue


ひとまずscriptsに下記を追加しておきます。
```js
  "scripts": {
    "postinstall": "prisma generate",
```

このまま進める前に
、Vercel上に環境変数を設定しておきます。チュートリアル通り、デプロイ環境用に新しく発行したキーを追加しましょう。
 Settings → Environment Variables

Redeployするとうまくいきました！以上でチュートリアル達成になります。
初心者の僕がここまでやるのに、かなり時間がかかりました。振り返ってみればくだらないエラーばかりでしたが…。ですが、これでこのあたりの技術にもなれることができたので
、別のチュートリアルをやってみたりしてみたいと思います。


### おまけ
ついでにGoogle認証も追加してみました。

1. `pages\api\auth\[...nextauth].ts`のファイルにGoogleの項目を追加します。
```ts
   providers: [
       GitHubProvider({
         clientId: process.env.GITHUB_ID,
         clientSecret: process.env.GITHUB_SECRET,
       }),
       // ↓
       GoogleProvider({
         clientId: process.env.GOOGLE_CLIENT_ID ?? "",
         clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? "",
       }),
       // ↑
   ],
```

2.Google Cloud Platform でOAuth用のAPI Keyを発行

3.ローカルなら.envファイルに、vercelならSettingsのEnvironment Valuesに追加
  必要なKeyは、GOOGLE_CLIENT_ID、GOOGLE_CLIENT_SECRETの2つだけです。

以上でGoogle認証も使えるようになります。簡単なので試してみてください。