⚡️

Cloudflare Pages上のSvelteKitでPostgreSQLに接続する

2023/09/29に公開1

はじめに

Cloudflare WorkersではTCPがサポートされており、node-postgresを使うことでPostgreSQLに接続することができます。
しかし、SvelteKitのadapter-cloudflareがbrowser向けにビルドしているため、Node.jsのAPIがビルドできず、node-postgresを使うことができません。
この問題を回避し、Cloudflare Pages上のSvelteKitでPostgreSQLに接続する方法を紹介します。

svelte-node-compat

https://github.com/kosei28/svelte-node-compat

この問題を解決するために、svelte-node-compatというライブラリを作りました。
このライブラリは、adapterをラップして、adapter-cloudflareがビルドする前にNode.jsをポリフィルしています。

インストール

npm install -D svelte-node-compat

使い方

使い方はとても簡単で、adapter()nodeCompat(adapter())に置き換えるだけです。

svelte.config.js
 import adapter from '@sveltejs/adapter-cloudflare';
 import { vitePreprocess } from '@sveltejs/kit/vite';
+import { nodeCompat } from 'svelte-node-compat';
 
 /** @type {import('@sveltejs/kit').Config} */
 const config = {
     preprocess: vitePreprocess(),
     kit: {
-        adapter: adapter(),
+        adapter: nodeCompat(adapter()),
     },
 };
 
 export default config;

すると次のように、pgを使うことができるようになります。

import pg from 'pg';

const pool = new pg.Pool({ connectionString: DATABASE_URL });

ライブラリを作った背景

正直、このライブラリによる解決策は非効率であまり良いものとは言えず、本来、このような問題はコントリビュートして解決するべきだと思います。
しかし、現時点において、adapter-cloudflareのNode.js対応についてのPRは複数あり、どうするべきか議論されている最中です。

関連するPR

そのため、SvelteKit側で対応されるまでのつなぎとして、SvelteKitに依存しないこのライブラリを作りました。

まとめ

今回、svelte-node-compatというライブラリを作りました。
このライブラリを使うことで、Cloudflare Pages上のSvelteKitでもPostgreSQLに接続することができます。
実際に、Cloudflare PagesからPostgreSQLに接続してみたら非常に便利だったので、SvelteKit側で正式に対応されるのが楽しみです。
CloudflareからHyperdriveも発表されたので、この組み合わせは今後ますます有用な選択肢になっていくと思います。
一足先に試してみたい方は、ぜひこのライブラリを使ってみてください。

Discussion

ひとしろひとしろ

この問題と数時間戦っていたので、大変助かりました。記事とライブラリありがとうございます。公式adapterで対応されるのが楽しみですね!