使用 Supabase 的 Realtime + Storage 非常方便呢

文章目录

  • (一)Supabase
  • (二)Realtime(消息)
    • (2.1)Python 消息订阅
    • (2.2)JavaScript 消息订阅
  • (三)Storage(存储)
    • (3.1)Python 存储操作
    • (3.2)JavaScript 存储操作

(一)Supabase

在《用 Next.js 和 Supabase 进行“全栈”开发的入门》中,我搭(抄)建(袭)了一个类似论坛雏形的东西。
后端用了Supabase,但例子中仅限于数据库CRUD(增删改查)的操作。
如果用Supabase只是Postgres用数据库,那么就称不上BaaS了吧😄
因为万恶的简称会重复,网上搜BaaS会出来:羊叫声区块链即服务蔚来汽车租电模式绑定为服务……所以……

概念:

  • 💡BaaS = Backend as a Service,就是一种云服务,旨在为移动和 Web 应用提供后端云服务,包括云端数据/文件存储、账户管理、消息推送等等……

打开Supabase的仪表板,除了已经用到的数据库和认证以外,还有3个主要内容:

  • Realtime
  • Storage
  • Edge Functions

(二)Realtime(消息)

简单说Supabase的Realtime就是实时的消息推送。
当我们把一张表的Realtime选项开启后,这张表数据的增删改操作,都会产生消息,并且推送到每个订阅了这个频道消息的客户端上。

⚠️ 注意: Realtime是基于WebSocket。不能保证每条消息都送到,所以你的应用如果有严格的要求,就不能完全依靠Realtime的推送,比如也使用长轮询Long Polling

图)表开启Realtime:
在这里插入图片描述

图)设置RealTime涉及的操作。
在这里插入图片描述

调试时我们可以在Supabase仪表板中作为客户端,订阅一个Realtime的频道。
实际使用时,我们需要用到Supabase社区项目来连接和使用消息订阅,如下。

(2.1)Python 消息订阅

见:🔗Supabase社区项目

from realtime.connection import Socket

SUPABASE_ID = "你的ID"
API_KEY = "你的匿名Key或系统Key"


def callback1(payload):
    print("Callback 1: ", payload)

if __name__ == "__main__":
    URL = f"wss://{SUPABASE_ID}.supabase.co/realtime/v1/websocket?apikey={API_KEY}&vsn=1.0.0"
    s = Socket(URL)
    s.connect()

    channel_1 = s.set_channel("realtime:*")
    channel_1.join().on("UPDATE", callback1)
    s.listen()

(2.2)JavaScript 消息订阅

见:🔗Supabase社区项目

import { RealtimeClient } from '@supabase/realtime-js'

const client = new RealtimeClient(REALTIME_URL, {
  params: {
    apikey: API_KEY
  },
})

const channel = client.channel('test-channel', {})

channel.subscribe((status, err) => {
  if (status === 'SUBSCRIBED') {
    console.log('Connected!')
  }

  if (status === 'CHANNEL_ERROR') {
    console.log(`There was an error subscribing to channel: ${err.message}`)
  }

  if (status === 'TIMED_OUT') {
    console.log('Realtime server did not respond in time.')
  }

  if (status === 'CLOSED') {
    console.log('Realtime channel was unexpectedly closed.')
  }
})

(三)Storage(存储)

简单说Supabase提供的文件存储是桶buckets,可以当成一个盘符,一个挂载的设备。
在一个bucket里面,可以创建目录和文件。

⚠️ 注意:公开的桶 public bucket ,仅表示它有一个可用于下载文件的公有 URL。
所有其他关于存储桶或文件的操作,都要求您满足该存储桶上的存储策略(权限)。
另请注意,您应该对所有其他操作使用正常路径,而不是包含“public”的公共 URL 路径。

怪不得找不到桶……

(3.1)Python 存储操作

见:🔗Supabase社区项目

初始化客户端

import os
from supabase import create_client, Client

url: str = os.environ.get("SUPABASE_URL")
key: str = os.environ.get("SUPABASE_KEY")
supabase: Client = create_client(url, key)

下载文件

bucket_name: str = "photos"
data = supabase.storage.from_(bucket_name).download("photo1.png")

上传文件

bucket_name: str = "photos"
new_file = getUserFile()
data = supabase.storage.from_(bucket_name).upload("/user1/profile.png", new_file)

删除文件

bucket_name: str = "photos"
data = supabase.storage.from_(bucket_name).remove(["old_photo.png", "image5.jpg"])

列举全部文件

bucket_name: str = "charts"
data = supabase.storage.from_(bucket_name).list()

移动/重命名文件

bucket_name: str = "charts"
old_file_path: str = "generic/graph1.png"
new_file_path: str = "important/revenue.png"
data = supabase.storage.from_(bucket_name).move(old_file_path, new_file_path)

(3.2)JavaScript 存储操作

见:🔗Supabase项目

下载文件

const { data, error } = await supabase
  .storage
  .from('avatars')
  .download('folder/avatar1.png')

上传文件

const avatarFile = event.target.files[0]
const { data, error } = await supabase
  .storage
  .from('avatars')
  .upload('public/avatar1.png', avatarFile, {
    cacheControl: '3600',
    upsert: false
  })

删除文件

const { data, error } = await supabase
  .storage
  .from('avatars')
  .remove(['folder/avatar1.png'])

列举全部文件

const { data, error } = await supabase
  .storage
  .from('avatars')
  .list('folder', {
    limit: 100,
    offset: 0,
    sortBy: { column: 'name', order: 'asc' },
  })

获得文件公开URL

const { data } = supabase
  .storage
  .from('public-bucket')
  .getPublicUrl('folder/avatar1.png')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/638589.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Centos7+JDK1.8】Jenkins安装手册

一、安装环境 Centos7 JDK1.8 Jenkins-2.346.3 JDK1.8安装以及网络配置等 自行搜索资料解决。 二、卸载历史安装的Jenkins,直接全部复制粘贴下面的命令 service jenkins stop yum -y remove jenkins rpm -e jenkins rpm -ql jenkins rm -rf /etc/sysconfig/je…

探索Facebook:数字社交的新时代

Facebook,作为全球最大的社交网络平台之一,一直在引领着数字社交的发展潮流。随着科技的不断进步和社会的不断变迁,Facebook也在不断演进和创新,迎接着数字社交的新时代。本文将探索Facebook在数字社交领域的新发展,以…

一个开源的工具类轮子是怎么造出来的

心路历程 为什么要做 在22年9月的某一天,在公司开需求评审时,接到了一个给PDF、图片添加水印的需求。做为一个刚工作的CURD程序员,在遇到这些问题时,第一反应是去github上找找有没有类似的开源框架。但是,出乎我意料…

基于springboot实现旅游管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生,其可以帮助使用者在…

XSS---DOM破坏

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.什么是DOM破坏 DOM破坏总结为一句话就是&#xff1a;利用HTML元素来响应JS代码的执行结果。 举个例子&#xff1a; <body> <img id"x"> <img name"y"…

145.栈和队列:删除字符串中的所有相邻重复项(力扣)

题目描述 代码解决 class Solution { public:string removeDuplicates(string s) {// 定义一个栈来存储字符stack<char> st;// 遍历字符串中的每一个字符for(int i 0; i < s.size(); i){// 如果栈为空或栈顶字符与当前字符不相同&#xff0c;则将当前字符入栈if(st.e…

JVM运行时内存:垃圾回收器(Serial ParNew Parallel )详解

文章目录 1. 查看默认GC2. Serial GC : 串行回收3. ParNew GC&#xff1a;并行回收4. Parallel GC&#xff1a;吞吐量优先 1. 查看默认GC -XX:PrintCommandLineFlags&#xff1a;查看命令行相关参数&#xff08;包含使用的垃圾收集器&#xff09;使用命令行指令&#xff1a;ji…

【简单介绍下爬山算法】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

java-查询字符串当中是否包含中文

文章目录 前言java-查询字符串当中是否包含中文 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊…

订餐系统总结、

应用层&#xff1a; SpringBoot:快速构建Spring项目&#xff0c;采用“约定大于配置”的思想&#xff0c;简化Spring项目的配置开发。 SpringMvc&#xff1a;Spring框架的一个模块&#xff0c;springmvc和spring无需通过中间整合层进行整合&#xff0c;可以无缝集成。 Sprin…

Predictable MDP Abstraction for Unsupervised Model-Based RL

ICML 2023 paper code Intro 文章提出了一种用于无监督基于模型强化学的方法&#xff0c;称为可预测MDP抽象&#xff08;Predictable MDP Abstraction, PMA&#xff09;。在MBRL中&#xff0c;一个关键部分是能够准确建模环境动力学动态模型。然而&#xff0c;这个预测模型误…

力扣652. 寻找重复的子树

Problem: 652. 寻找重复的子树 文章目录 题目描述思路复杂度Code 题目描述 思路 1.利用二叉树的后序遍历将原始的二叉树序列化&#xff08;之所以利用后序遍历是因为其在归的过程中是会携带左右子树的节点信息,而这些节点信息正是该解法要利用的东西&#xff09;&#xff1b; 2…

IDEA中一些常见操作【持续更新】

文章目录 前言善用debugidea中debug按钮不显示自动定位文件【始终选择打开的文件】idea注释不顶格【不在行首】快速定位类的位置【找文件非常快】创建文件添加作者及时间信息快速跳转到文件顶端 底端 前言 因为这些操作偶尔操作一次&#xff0c;不用刻意记忆&#xff0c;有个印…

中国主要城市房价指数数据集(2011-2024)

数据来源&#xff1a;东方财富网 时间跨度&#xff1a;2011年1月 - 2024年4月 数据范围&#xff1a;中国主要城市 包含指标&#xff1a; 日期、城市 新建商品住宅价格指数-同比 新建商品住宅价格指数-环比 新建商品住宅价格指数-定基 二手住宅价格指数-环比 二手住宅价格指…

K8s-yaml文件

一.Yaml文件详解&#xff1a; Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式&#xff1a;主要用于 api 接口之间消息的传递YAML 格式&#xff1a;用于配置和管理&#xff0c;YAML 是一种简洁的非标记性语言&#xff0c;内容格式人性化&#xff0c;较易读 YAML 语…

英语学习笔记20——Look at them!

Look at them! 看看他们&#xff01; 词汇 Vocabulary big a. 大的&#xff08;尺寸&#xff0c;年龄&#xff0c;音量……&#xff09; 搭配&#xff1a;big cheese 大人物    big mouth 大嘴巴&#xff08;传话的人&#xff09;    big talker 吹牛的人 例句&#xf…

汇编语言(STC89C52)

指令是计算机计算CPU根据人的意图来执行某种操作的命令。一台计算机所执行的全部指令的集合&#xff0c;称为这个CPU的指令系统。而想要使计算机按照人们的要求完成一项工作&#xff0c;就必须让CPU按顺序执行预设的操作&#xff0c;即逐条执行人们编写的指令。这种按照人民要求…

2024年5月份最新独角数卡使用USDT详细小白教程

直观配套视频教程 2024年5月份最新独角数卡安装及USDT使用详细小白教程 1、创建服务器 Centos或者Ubuntu2、宝塔面板开心版安装寶塔 Linux 面版 8.0.5 開心版 - 2024年1月12日 - 开心专区 - 异次元 - Powered by Discuz!Centos安装命令&#xff08;默认安装是 8.0.1 直接在线升…

USB数据恢复软件:轻松找回U盘重要数据!

USB数据丢失的原因 USB数据丢失有一些常见原因&#xff0c;了解这些原因有利于恢复数据。 文件意外删除病毒攻击软件错误未安全弹出USB设备格式化USB设备 顺便一提&#xff0c;如果你通过快捷键“Ctrl D”删除了数据&#xff0c;那你可以从回收站中还原它们。如果你永久删除…

【全开源】国际版JAVA同城服务美容美发到店服务上门服务系统源码支持Android+IOS+H5

一、同城服务新篇章&#xff0c;开启便捷美容美发新时代 随着生活节奏的加快&#xff0c;人们越来越注重便捷与高效的生活方式。为了满足这一需求&#xff0c;我们精心研发了“国际版同城服务美容美发到店服务上门服务系统小程序源码”。这款源码不仅结合了本地化的服务特色&a…