跳到主要内容

Next.js 与Supabase

介绍

在现代Web开发中,数据库集成是一个至关重要的环节。Next.js作为一个强大的React框架,提供了服务器端渲染(SSR)和静态生成(SSG)等功能,而Supabase则是一个开源的Firebase替代品,提供了数据库、身份验证和存储等功能。将Next.js与Supabase结合,可以快速构建功能丰富的全栈应用。

本文将带你从零开始,学习如何在Next.js项目中集成Supabase,并通过实际案例展示其应用。

什么是Supabase?

Supabase是一个开源的Firebase替代品,提供了以下功能:

  • 数据库:基于PostgreSQL的关系型数据库。
  • 身份验证:支持多种身份验证方式,如电子邮件/密码、OAuth等。
  • 存储:文件存储和管理。
  • 实时订阅:实时监听数据库变化。

Supabase的API设计简单易用,非常适合与Next.js等现代前端框架集成。

在Next.js中集成Supabase

1. 创建Supabase项目

首先,你需要在Supabase官网上创建一个新项目。创建完成后,你会获得一个URL和一个anon key,这些将用于在Next.js中配置Supabase客户端。

2. 安装Supabase客户端

在Next.js项目中,使用以下命令安装Supabase客户端库:

bash
npm install @supabase/supabase-js

3. 配置Supabase客户端

在Next.js项目中,创建一个lib文件夹,并在其中创建一个supabaseClient.js文件,用于初始化Supabase客户端:

javascript
import { createClient } from '@supabase/supabase-js';

const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL;
const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY;

export const supabase = createClient(supabaseUrl, supabaseKey);

确保在.env.local文件中添加以下环境变量:

bash
NEXT_PUBLIC_SUPABASE_URL=your-supabase-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key

4. 使用Supabase进行数据库操作

现在,你可以在Next.js的任何页面或组件中使用Supabase客户端进行数据库操作。以下是一个简单的示例,展示如何从数据库中获取数据:

javascript
import { useEffect, useState } from 'react';
import { supabase } from '../lib/supabaseClient';

export default function Home() {
const [data, setData] = useState([]);

useEffect(() => {
const fetchData = async () => {
const { data, error } = await supabase
.from('your_table_name')
.select('*');

if (error) {
console.error('Error fetching data:', error);
} else {
setData(data);
}
};

fetchData();
}, []);

return (
<div>
<h1>Data from Supabase</h1>
<ul>
{data.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</ul>
</div>
);
}

5. 实时订阅

Supabase还支持实时订阅功能,允许你在数据发生变化时自动更新UI。以下是一个实时订阅的示例:

javascript
useEffect(() => {
const subscription = supabase
.from('your_table_name')
.on('*', (payload) => {
console.log('Change received!', payload);
setData((prevData) => [...prevData, payload.new]);
})
.subscribe();

return () => {
supabase.removeSubscription(subscription);
};
}, []);

实际案例:构建一个简单的任务管理器

让我们通过一个实际案例来展示如何在Next.js中使用Supabase构建一个简单的任务管理器。

1. 创建任务表

首先,在Supabase中创建一个名为tasks的表,包含以下字段:

  • id (UUID, 主键)
  • name (text)
  • completed (boolean)

2. 添加任务

在Next.js中创建一个表单,允许用户添加新任务:

javascript
import { useState } from 'react';
import { supabase } from '../lib/supabaseClient';

export default function AddTask() {
const [taskName, setTaskName] = useState('');

const handleSubmit = async (e) => {
e.preventDefault();
const { data, error } = await supabase
.from('tasks')
.insert([{ name: taskName, completed: false }]);

if (error) {
console.error('Error adding task:', error);
} else {
setTaskName('');
alert('Task added successfully!');
}
};

return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={taskName}
onChange={(e) => setTaskName(e.target.value)}
placeholder="Enter task name"
/>
<button type="submit">Add Task</button>
</form>
);
}

3. 显示任务列表

接下来,创建一个组件来显示任务列表:

javascript
import { useEffect, useState } from 'react';
import { supabase } from '../lib/supabaseClient';

export default function TaskList() {
const [tasks, setTasks] = useState([]);

useEffect(() => {
const fetchTasks = async () => {
const { data, error } = await supabase
.from('tasks')
.select('*');

if (error) {
console.error('Error fetching tasks:', error);
} else {
setTasks(data);
}
};

fetchTasks();
}, []);

return (
<div>
<h2>Tasks</h2>
<ul>
{tasks.map((task) => (
<li key={task.id}>
{task.name} - {task.completed ? 'Completed' : 'Pending'}
</li>
))}
</ul>
</div>
);
}

4. 实时更新任务列表

最后,使用Supabase的实时订阅功能,确保任务列表在任务添加或更新时自动刷新:

javascript
useEffect(() => {
const subscription = supabase
.from('tasks')
.on('*', (payload) => {
setTasks((prevTasks) => [...prevTasks, payload.new]);
})
.subscribe();

return () => {
supabase.removeSubscription(subscription);
};
}, []);

总结

通过本文,你已经学会了如何在Next.js项目中集成Supabase,并实现基本的数据库操作和实时订阅功能。Supabase的强大功能使得它成为构建现代Web应用的理想选择,尤其是在需要快速开发和实时更新的场景中。

附加资源

练习

  1. 尝试扩展任务管理器,添加任务完成状态切换功能。
  2. 使用Supabase的身份验证功能,为任务管理器添加用户登录和权限控制。
  3. 探索Supabase的存储功能,尝试在任务管理器中添加文件上传功能。

希望本文对你有所帮助,祝你在Next.js和Supabase的学习之旅中取得成功!