⚡ Supabase.js
21 Jan, 2026
On this page
Selecting data Jump to heading
const { data, error } = await supabase.from('posts').select(`*`)
Matching data Jump to heading
const { data, error } = await supabase
.from('posts')
.select(`*`)
.match({ status: 'active' })
Selecting specific items Jump to heading
const { data: entry } = await supabase
.from('posts')
.select(`*`)
.match({ id: 1234, status: 'active' })
.single()
Sorting data Jump to heading
const { data, error } = await supabase
.from('posts')
.select(`*`)
.order('date', { ascending: false })
Related data Jump to heading
const { data, error } = await supabase
.from('posts')
.select(`*, journals(name, id)`)
Paginate results Jump to heading
const getPagination = (page: number, count: number) => {
const limit = count ? +count : 3
const from = page ? page * limit : 0
const to = page ? from + count - 1 : count - 1
return { from, to }
}
const { from, to } = getPagination(page, 10)
const { data, count } = await supabase
.from('posts')
.select('*', { count: 'exact' })
.order('id', { ascending: true })
.range(from, to)
Selecting data by date Jump to heading
const { data, error } = await supabase
.from('events')
.select('*')
.gte('starttime', new Date('2021-07-10').toISOString())
.lte('starttime', new Date('2021-07-11').toISOString())
Adding data Jump to heading
const { data, error } = await supabase
.from('posts')
.insert([
{
title: 'The title',
body: 'The body',
owner: session?.user.id,
},
])
.select() // This is needed to return the inserted data
Generated your schema locally Jump to heading
npx supabase gen types typescript --project-id \"your-project-id\" --schema public > src/types/supabase.ts
@supabase/ssr Jump to heading
Browser client Jump to heading
import { Database } from '@/src/types/supabase' // generated from your DB schema
import { createBrowserClient as _createBrowserClient } from '@supabase/ssr'
export const createBrowserClient = () =>
_createBrowserClient<Database>(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
)
Server client Jump to heading
The newer @supabase/ssr API uses getAll and setAll for cookie handling:
import { createServerClient } from '@supabase/ssr'
import { cookies } from 'next/headers'
import { Database } from '@/types/supabase'
export async function createClient() {
const cookieStore = await cookies()
return createServerClient<Database>(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
getAll() {
return cookieStore.getAll()
},
setAll(cookiesToSet) {
try {
cookiesToSet.forEach(({ name, value, options }) =>
cookieStore.set(name, value, options)
)
} catch {
// The `setAll` method was called from a Server Component.
// This can be ignored if you have middleware refreshing
// user sessions.
}
},
},
}
)
}
Middleware client Jump to heading
import { createServerClient } from '@supabase/ssr'
import { NextResponse, type NextRequest } from 'next/server'
export async function updateSession(request: NextRequest) {
let supabaseResponse = NextResponse.next({
request,
})
const supabase = createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
getAll() {
return request.cookies.getAll()
},
setAll(cookiesToSet) {
cookiesToSet.forEach(({ name, value, options }) =>
request.cookies.set(name, value, options)
)
supabaseResponse = NextResponse.next({
request,
})
cookiesToSet.forEach(({ name, value, options }) =>
supabaseResponse.cookies.set(name, value, options)
)
},
},
}
)
// Refresh session if expired
await supabase.auth.getUser()
return supabaseResponse
}
Use in middleware:
// middleware.ts
import { type NextRequest } from 'next/server'
import { updateSession } from '@/utils/supabase/middleware'
export async function middleware(request: NextRequest) {
return await updateSession(request)
}
export const config = {
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)'],
}
← Back home