Cloudflare Pages上のSvelteKitでPostgreSQLに接続する
はじめに
Cloudflare WorkersではTCPがサポートされており、node-postgresを使うことでPostgreSQLに接続することができます。
しかし、SvelteKitのadapter-cloudflareがbrowser向けにビルドしているため、Node.jsのAPIがビルドできず、node-postgresを使うことができません。
この問題を回避し、Cloudflare Pages上のSvelteKitでPostgreSQLに接続する方法を紹介します。
svelte-node-compat
この問題を解決するために、svelte-node-compatというライブラリを作りました。
このライブラリは、adapterをラップして、adapter-cloudflareがビルドする前にNode.jsをポリフィルしています。
インストール
npm install -D svelte-node-compat
使い方
使い方はとても簡単で、adapter()
をnodeCompat(adapter())
に置き換えるだけです。
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で対応されるのが楽しみですね!