サーバレスDB(Postgresql : NeonDB ) の無料版にCloudflare Workers ( Node.js) から繋いだメモ

# 概要
Cloudflare Workers から NeonDBにつないでみた。

Cloudflare Workersを作成するまでは 「[Cloudflare Workers プロジェクト作成から GitHub Actions 自動デプロイまで最速でやる](https://zenn.dev/monicle/articles/4613eb4064dc40)」を参考にした。(  [issue](https://github.com/hibohiboo/odyssage/issues/14) , [commit](https://github.com/hibohiboo/odyssage/tree/1ee54f9cd58fdd879216e6f871a3da3ab3cc6811/apps/backend) )
Honoの導入は「[Cloudflare Workers with Hono on bun を試す](https://zenn.dev/watsuyo_2/scraps/76e60a75ada45e)」を参考にした。( [commit](https://github.com/hibohiboo/odyssage/blob/2353df1052a0b04dffd5b5c51df0843c4a799b39/apps/backend/src/index.ts) )

[ソースコード](https://github.com/hibohiboo/odyssage/blob/ef321dc878ee57d29023ee90d61657dd3d7dda23/apps/backend/src/index.ts)

# Neonの設定

[1年前](https://qiita.com/hibohiboo/items/827f0e99afd0597d6425)とGUIが変わっている。

## ロールの準備

「Branches」を選択し、対象をクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/b1a41552-cde3-0ed6-ae2c-6d8d23f8cfa5.png)

 「Roles & Databases」のタブを選択
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/f1a3cb01-233a-1694-3b8f-11bc5f4b5fff.png)
「Add role」ボタンをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/e24ff7e3-7b5c-ce6f-3a27-fb2549eb8e46.png)

ロール名を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/ed9d69ad-e66d-f20d-c49e-7ebca085c0cf.png)

「Download .env」ボタンを押下し、作成されたパスワードを控えておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/70bdeadc-e31d-af6c-13b6-6c3d0330ff26.png)

ダウンロードされる.env.txtの内容は下記

```
PGUSER=入力したロール名
PGPASSWORD=出力されたパスワード
```

環境変数を Cloudflare works に設定しておく。下記コマンドを入れると入力を促されるので、`postgresql://入力したロール名:出力されたパスワード@fuga.us-west-2.aws.neon.tech/main?sslmode=require`を設定。

```
wrangler secret put NEON_CONNECTION_STRING
```
```
$ wrangler secret put NEON_CONNECTION_STRING

 ⛅️ wrangler 3.99.0
-------------------

√ Enter a secret value: ... ********************************************************************************************************
🌀 Creating the secret for the Worker "odyssage-backend"
✨ Success! Uploaded secret NEON_CONNECTION_STRING
```

# ソースコード
DBから値を取り出すだけのテスト関数を作って確認。

```apps/backend/src/index.ts
import { Hono } from 'hono';
import { neon } from '@neondatabase/serverless';

const app = new Hono<{ Bindings: { NEON_CONNECTION_STRING: string } }>();

app.get('/', (c) => c.text('Hello Cloudflare Workers!'));
app.get('/characters', async (c) => {
	const sql = neon(c.env.NEON_CONNECTION_STRING);
	const data = await sql('SELECT * FROM public.character');

	return c.json(data);
});

export default app;
```

# 確認(2025.01.05更新)
(2025.01.02更新)
下記のキャラクターのAPIは削除した。
~~https://odyssage-backend.hibohiboo66-cloudflare.workers.dev/characters~~

<details><div>

DBの値を確認できた。

```json
[{"id":"test1","name":"foo"}]
```

</div></details>

[drizzleを導入](https://github.com/hibohiboo/odyssage/issues/19)し、シナリオのAPIで動作確認した。
https://odyssage-backend.hibohiboo66-cloudflare.workers.dev/scenarios

(2025.01.05更新)
~~また、OpenAPIを公開した。~~
Hono OpenAPIがESMに対応しておらず、テストが失敗したため、OpenAPIの公開をHonoで行うことはいったんあきらめた。[redocで普通に作成](https://hibohiboo.github.io/odyssage/odyssage-openapi/)


<details>

https://odyssage-backend.hibohiboo66-cloudflare.workers.dev/docs

[この時点のソースコード](https://github.com/hibohiboo/odyssage/blob/04ddde5efb4dec01df1c10e11761f1d257052a94/apps/backend/src/index.ts)

</details>

# ローカルで実行する 2025.01.05 追記

[Neon(Postgres)のDockerをローカルで稼働させ、Drizzleを使ったマイグレーションとCloudflare Workersのローカル実行からの接続を行ったメモ](https://qiita.com/hibohiboo/items/1827c41ce162431fda3e)に記載

# 参考
[Neon - roles](https://neon.tech/docs/manage/roles)
[Cloudflare Workers の wrangler.toml に環境変数を書かないで管理する](https://zenn.dev/mr_ozin/articles/645502f4a621d6)
[【個人開発】無料DBを求めてPlanetScaleからNeonに移行したら快適だった話](https://qiita.com/nuko-suke/items/e940ff8ccde35d09f668)

[Hono - OpenAPI](https://hono.dev/examples/hono-openapi)