This repo demonstrates the use of Zapatos with Neon's serverless driver on Vercel Edge Functions.
We implement a simple app that generates a JSON listing of the user's nearest 10 UNESCO World Heritage sites via IP geolocation (data copyright © 1992 – 2022 UNESCO/World Heritage Centre).
Note: at the time of writing, WebSockets are not supported in the local Vercel development environment, so npx vercel dev
is not usable.
The @neondatabase/serverless
driver is compatible with (and built on top of) node-postgres, the pg
package. But because Zapatos tries to import the pg
package directly, we have a small amount of extra work to do.
First, we include a tiny local-path package, which you'll find in shims/pg
. This calls itself pg
but simply re-exports the contents of @neondatabase/serverless
. That makes Zapatos work in a serverless environment.
Second, we generate and update the Zapatos schema types (inside ./zapatos
) at development-time using Node, by running npm run update-zapatos-types
. Node has no native WebSocket
object, but the @neondatabase/serverless
driver tries to import the ws
package in this case, so we include ws
as one the devDependencies
in package.json
.
Third, it's important to set "strict": true
and add "zapatos/**/*"
to the "include"
directive in tsconfig.json
.
-
Ensure the
psql
client is installed -
Create a Neon database and make a note of the connection string.
-
Clone this repo, then:
# get dependencies
npm install
# set up Vercel
npx vercel login
npx vercel link
# create DATABASE_URL environment variable, remote and local
npx vercel env add DATABASE_URL # paste in the connection string: postgres://...
npx vercel env pull .env.local # now bring it down into ./.env.local for local use
# create the schema and copy data to DB
(source .env.local \
&& curl -s https://gist.githubusercontent.com/jawj/a8d53ff339707c65128af83b4783f4fe/raw/45dbcc819b00ecb72f80b0cf91e01b3d055662b5/whc-sites-2021.psql \
| psql $DATABASE_URL)
# update Zapatos types from DB
npm run update-zapatos-types
# ... and deploy
npx vercel deploy
- Now visit the deployed function at the URL given