Nuxt3 实战 (七):配置 Supabase 数据库

简介: 这篇文章介绍了如何为Nuxt项目集成Supabase数据库。文章首先阐述了选择Supabase作为Nuxt项目的数据库的理由,包括其良好的网络评价、与Nuxt的良好集成以及对用户认证和身份鉴权的支持。接着,文章详细介绍了Supabase的特点,如使用PostgreSQL作为数据库、提供完整的认证系统、支持实时数据同步和提供对象存储服务等。然后,文章指导读者如何在Nuxt项目中安装和配置Supabase,包括设置重定向策略和获取数据库访问密钥。最后,文章强调了在开发环境和生产环境中使用不同密钥的重要性。

前言

这个章节我们要先把数据库的环境配置好,古人云:工欲善其事,必先利其器

这两天我一直在网上寻找最适合 Nuxt 的数据库,之前在做个人项目时经常用的是 MysqlMongoDB,也用过 ORM 框架比如:SequelizeTypeORM,本来计划使用 Prisma,后来认真看了 Nuxt 集成的数据库模块后,还是选择了 Supabase,在我看来主要原因有3点:

  1. Supabase 网上风评比较好,而且 Nuxt 集成了 Nuxt Supabase 模块
  2. 用户认证和身份鉴权开箱即用,提供了多种认证类型机制
  3. 我没用过,在开发上我喜欢用我没用过的技术或工具

话不多说,直接整活。

Supabase 介绍

Supabase 是一个开源的 Firebase 替代品,提供了一系列的后端功能,让你可以更快地构建产品。主要特点有:

  • 数据库:Supabase 使用 PostgreSQL 作为数据库,支持 SQL 和 RESTful API 访问
  • 认证:Supabase 提供了一个完整的认证系统,支持邮箱、手机号、第三方服务等多种登录方式
  • 实时订阅:Supabase 允许你通过 WebSocket 实现实时数据同步,无需编写额外的代码
  • 存储:Supabase 提供了一个对象存储服务,可以方便地上传、下载和管理文件
  • 边缘函数:Supabase 支持在边缘节点上运行 JavaScript 函数,可以用来处理请求或触发事件

Supabase 有一个免费套餐,可以让你创建最多三个项目,并享受一定的资源限额。如果你需要更多的项目或资源,你可以选择按需付费或者预付费的套餐。

创建 Supabase 数据库

  1. 打开 Supabase Dashboard,选择登录方式,这里我直接选择 Github 登录
    fhskdiqcvro1niqatwtnn8zudflosdtp.png

  2. 进入控制台,点击 New project 创建项目
    3ot25n0mrowstwa5syxbfyp52q9u5dv6.png

  3. 进入项目管理界面,点击左侧菜单的 Database,再点击右侧的 New table 创建一张表
    hbrxids6amecmkelxyjnd89s02rjqqhq.png
    roov67ea7ddwrtqphdvmudj0scog0e8k.png

  4. 点击右侧菜单的 Table Editor,打开新建的表,先插入两条测试数据
    tnq2fhltso2i50vl3ekwxt5t2799u1av.png

  5. 点击右侧菜单的 Project Settings - API,在右侧可以看到项目连接所需要的密钥
    dmrekfo2ahkghbz55xahn7i9jfc86sv9.png

    到这里,我们就创建好数据库了,接下来我们在 Nuxt 上测试一下是否能成功连接。

Nuxt 安装 Supabase

  1. 根目录下执行命令
    pnpm add @nuxtjs/supabase -D
    pnpm add @supabase/supabase-js
    
  2. .env 文件中添加 SUPABASE_URLSUPABASE_KEY
    SUPABASE_URL="https://example.supabase.co"
    SUPABASE_KEY="<your_key>"
    
  3. 打开 nuxt.config.ts 文件,添加配置:

    export default defineNuxtConfig({
         
         
    modules: ['@nuxtjs/supabase'],
    // 自定义配置
    supabase: {
         
         
    redirect: false // https://supabase.nuxtjs.org/get-started#redirect
    },
    })
    

    这里我们先将配置 redirect 设置为 false,因为 Supabase 默认如果未经身份验证的用户试图访问受保护的登录页面,则自动重定向到配置的登录页面。

  4. 打开 pages/index.vue 文件,尝试访问数据库

    <template>
    <div
      class="flex justify-center items-center font-black text-5xl flex-col"
      style="height: calc(100vh - 8rem)"
    >
      Hello World!
      <div class="flex gap-4 mt-4">
        <UButton
          v-for="item in data"
          :key="item.id"
          :label="item.name"
        />
      </div>
    </div>
    </template>
    
    <script setup lang="ts">
    import type {
          
           CategoryList } from '~/types'
    const supabase = useSupabaseClient<CategoryList>()
    
    const {
          
           data, error } = await supabase.from('site_category').select()
    
    console.log('data',data)
    console.log('error',error)
    </script>
    

    在浏览器打开,如果不出意外的话,你能连接到数据库,但是你会得到一个空数组。重点来了,这是为什么呢?
    a777il7di2htlhvet8cm5d8qx3meunq7.png

配置 RLS 安全策略

之所以会得到空数组,是因为 Supabase 为每张表启动 Row Level Security 策略,我们回到 Supabase Dashboard,打开右侧菜单 Authentication - Policies,可以看到在表的安全策略中有个提示:
ihlc7hcawfui5b8gqzie8y9bsmf9zpqm.png

翻译就是:已为此表启用行级别安全性,但未设置任何策略,选择查询将返回一个空的结果数组。

知道原因后,我们需要配置一个安全策略,点击右侧的 Create policy,这里我们只需要放开 Select 查询的权限就行,它会绕过 Row Level Security 策略:
eicd2jipg630o0z8ssyuk6slbjxz6h6z.png

刷新浏览器,我们就能看到数据正常访问了:
ye77q8bor7oln473ncav48693in6vd0c.png

这里我们只是放开了 Select 查询的权限,后续的 INSERTUPDATE 等操作权限会在身份认证后才可以执行。

总结

通过本文,你可以成功使用 Nuxt 连接 Supabase 数据库,但其中也有几个点需要注意:

  1. Supabase 为每张表启动 Row Level Security 策略,如果你想在不经过身份认证的情况下执行数据库操作,需要配置 Policies 策略
  2. Project Settings - API 有两个 Project API keys
    • anon key:如果为表和已配置的策略启用了行级安全性,则可以在浏览器中安全使用此键
    • service_role:此密钥具有绕过行级安全性的能力,永远不要公开分享
  3. 在开发环境中,我们往往需要不用完成身份认证就能执行数据库操作,这时候你就可以把 SUPABASE_KEY 设置成 service_role

但是生产环境中一定要切换成 anon key,因为 SUPABASE_KEY 会暴露在浏览器的请求头中

Github 仓库dream-site

线上预览dream-site.cn

相关文章
|
22天前
|
数据库连接 Linux Shell
Linux下ODBC与 南大通用GBase 8s数据库的无缝连接配置指南
本文详细介绍在Linux系统下配置GBase 8s数据库ODBC的过程,涵盖环境变量设置、ODBC配置文件编辑及连接测试等步骤。首先配置数据库环境变量如GBASEDBTDIR、PATH等,接着修改odbcinst.ini和odbc.ini文件,指定驱动路径、数据库名称等信息,最后通过catalog.c工具或isql命令验证ODBC连接是否成功。
|
1月前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
135 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
1月前
|
消息中间件 资源调度 关系型数据库
如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理
本文介绍了如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理。主要内容包括安装Debezium、配置Kafka Connect、创建Flink任务以及启动任务的具体步骤,为构建实时数据管道提供了详细指导。
75 9
|
1月前
|
存储 SQL 数据库
深入浅出后端开发之数据库优化实战
【10月更文挑战第35天】在软件开发的世界里,数据库性能直接关系到应用的响应速度和用户体验。本文将带你了解如何通过合理的索引设计、查询优化以及恰当的数据存储策略来提升数据库性能。我们将一起探索这些技巧背后的原理,并通过实际案例感受优化带来的显著效果。
47 4
|
1月前
|
安全 Nacos 数据库
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改。本文详细探讨了这一问题的原因及解决方案,包括限制公网访问、使用HTTPS、强化数据库安全、启用访问控制、监控和审计等步骤,帮助开发者确保服务的安全运行。
45 3
|
1月前
|
PHP 数据库 数据安全/隐私保护
布谷直播源码部署服务器关于数据库配置的详细说明
布谷直播系统源码搭建部署时数据库配置明细!
|
1月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
236 1
|
1月前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
51 2
|
1月前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
135 2
|
1月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
92 0