首页  >  文章  >  web前端  >  使用 Express 和 Supabase 创建您自己的事件调度 API

使用 Express 和 Supabase 创建您自己的事件调度 API

Patricia Arquette
Patricia Arquette原创
2024-11-05 12:03:02518浏览

Create your own Event Scheduling API using Express and Supabase

曾经需要一个平台来管理您俱乐部的活动吗?或者也许在您的办公室安排会议?但在寻找价格实惠的平台时,您是否在众多的选择中迷失了方向?或者也许您只是想更好地安排您的生活并安排何时必须参加哪些活动?

按照这篇文章进行到底,您最终将获得一个基本的事件调度 API,其中将提供事件创建和注册等所有基本功能。

该项目的 GitHub 存储库位于 https://github.com/xerctia/gatherly

什么是快递?

Express 是一个 Javascript 框架,用于设置和构建服务器来处理各种类型的请求,如 GET、POST 等。Express 是最常用的后端框架之一,也是初学者最容易上手的框架之一。在本博客中,我们将使用 Express 来制作我们的服务器并设置所需的端点。

什么是 PostgreSQL?

PostgreSQL 是一个开源关系数据库管理系统 (RDBMS),以其可靠性、可扩展性和对复杂查询的支持而闻名。它提供了高级功能,例如对 JSON 数据的支持、全文搜索和可扩展性,使其适用于小型项目和大型应用程序。 PostgreSQL 深受开发者欢迎,并因其强大的性能而受到重视。

网络上有许多 PostgreSQL 提供商允许使用 PostgreSQL 数据库,有些是免费的,有些是付费计划。在这个项目中,我们将使用 Supabase 及其数据库作为我们的 PostgreSQL。

设置项目

  • 为此项目创建一个文件夹。我会把它命名为Gatherly,这是我决定的名字。
  • 设置 Node 和 npm:npm init -y
  • 安装 Express 和其他所需的软件包: npm 安装 Express dotenv cors pg 注意: pg 是 Node.js 中使用 PostgreSQL 的包。
  • 现在使用以下样板代码创建一个index.js 文件:
const exp = require('express');
const cors = require('cors');

const app = exp();
const PORT = 3000 || process.env.PORT;

app.use(express.json());
app.use(express.urlencoded({extended: true}));
app.use(cors());

app.get("/", (req, res) => {
    res.send("Hello, Gatherly!");
})

app.listen(PORT, () => {
    console.log(`server started on ${PORT}`);
})

恭喜!您已成功在 Express 中设置基本服务器!

使用您的项目设置 Supabase

Supabase 设置

  • 访问 https://supabase.com 并登录或创建一个帐户,然后使用您认为合适的任何名称创建一个新项目。我已将其命名为 Gatherly(显然)。
  • 现在转到项目仪表板,然后导航到项目设置 ->数据库。
  • 在页面的开头,将出现“连接字符串”部分。单击此处的 Node.js 选项卡并复制连接字符串并将其暂时存储在某个位置。
  • 现在转到 SQL 编辑器并运行以下查询来创建“事件”表:
const exp = require('express');
const cors = require('cors');

const app = exp();
const PORT = 3000 || process.env.PORT;

app.use(express.json());
app.use(express.urlencoded({extended: true}));
app.use(cors());

app.get("/", (req, res) => {
    res.send("Hello, Gatherly!");
})

app.listen(PORT, () => {
    console.log(`server started on ${PORT}`);
})

将数据库连接到 Express

  • 转到您的项目文件夹并创建一个名为 .env 的文件。写入 DATABASE_URL=,然后粘贴您之前复制的连接字符串(Supabase 设置:步骤 3)并将其括在双引号内。例如:
CREATE TABLE events (
  id SERIAL PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  description TEXT,
  start_time TIMESTAMP NOT NULL,
  end_time TIMESTAMP,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • 创建另一个JS文件db.js来设置和连接PostgreSQL数据库。
DATABASE_URL="postgresql://username:password@host:port/dbname"
  • 现在最后,我们需要将此连接的数据库导入到我们的主index.js 文件中。
const { Pool } = require('pg');
require('dotenv').config();

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: {
    rejectUnauthorized: false
  }
});

module.exports = pool;

恭喜,您已成功将 Supabase 数据库连接到 index.js 文件。我们现在准备开始构建实际的 API 端点。

API端点

GET /events :获取所有事件

  • 创建一个新的 GET 方法,如下所示:
const exp = require('express');
const cors = require('cors');

const app = exp();
const PORT = 3000 || process.env.PORT;

app.use(express.json());
app.use(express.urlencoded({extended: true}));
app.use(cors());

app.get("/", (req, res) => {
    res.send("Hello, Gatherly!");
})

app.listen(PORT, () => {
    console.log(`server started on ${PORT}`);
})
  • 在这个函数中,我们将编写实际的代码来获取数据。首先,让我们实现一个 try-catch 块以更好地处理错误。
CREATE TABLE events (
  id SERIAL PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  description TEXT,
  start_time TIMESTAMP NOT NULL,
  end_time TIMESTAMP,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • 我们将构建的所有端点都会保留这种格式。在 try 块中,我们将编写所需功能的代码。
  • 要获取数据库中的所有事件,我们需要查询数据库并将其存储在变量中。由于我们采用异步方法,因此我们需要使用await 来正确存储数据。
DATABASE_URL="postgresql://username:password@host:port/dbname"
  • 此查询的输出(即结果)有一个称为“行”的对象数组。在这里,我们需要返回所有事件,因此我们将只返回整个“行”。
const { Pool } = require('pg');
require('dotenv').config();

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: {
    rejectUnauthorized: false
  }
});

module.exports = pool;
  • 这样,我们的第一个端点就准备好了!要对其进行测试,您可以转到 Supabase 项目仪表板的表编辑器并添加 2 或 3 个事件以进行测试。该端点的完整代码是:
const pool = require('./db');

POST /events :创建一个新事件

  • 首先,让我们设置一个端点的基本样板:
app.get('/events', async (req, res) => {
  // code to be written
})
  • 在这种情况下,由于我们需要从用户那里获得一些数据,因此我们可以在 try-catch 块之外定义这些数据。
try {
  // code to be written
} catch (e) {
  console.error(e);
  res.status(500).json({error: "Database error."}); // 500 = Internal Server Error
}
  • 现在在 try 块中,我们需要编写查询以在表中插入一行。 query() 方法允许您将字符串查询中的变量值表示为 $1、$2 等,然后在数组中按顺序提供这些变量。这就是我们将用户的变量输入添加到查询中的方式。
const result = await pool.query("SELECT * FROM events");
  • 与上次一样,我们将再次打印结果行。但这一次,我们只需要打印“rows”数组的第一个元素,这将是我们刚刚插入的行。
res.status(200).json(result.rows); // 200 = OK
  • 万岁,我们已经构建了端点来添加新事件!这是完整的代码:
app.get('/events', async (req, res) => {
    try {
        // Getting all events
        const result = await pool.query("SELECT * FROM events");
        res.status(200).json(result.rows); // 200 = OK
    } catch (e) {
        console.error(e);
        res.status(500).json({error: 'Database error'}); // 500 = Internal Server Error
    }
})

GET /event/:id :获取单个事件的详细信息

  • 我相信您足够聪明,能够为任何端点设置基本功能,所以我不会每次都展示它。
  • 在这里,我们的目标是创建一个动态端点,其中“id”的值将不断变化。因此,我们将其标记为 :id,并且可以按如下方式访问其值:
app.post("/events", async (req, res) => {
  try {
    // code to be written
  } catch (e) {
    console.error(e);
    res.status(500).json({error: "Failed to create event."}); // 500 = Internal Server Error
  }
})

这也可以在 try-catch 之外完成,就像前一个端点中的输入值一样。

  • 现在在 try 块中,我们需要编写查询来选择“id”字段等于提供的 id 的行。如果没有找到结果,则意味着该 id 的事件不存在,因此我们可以返回 404 错误。
const exp = require('express');
const cors = require('cors');

const app = exp();
const PORT = 3000 || process.env.PORT;

app.use(express.json());
app.use(express.urlencoded({extended: true}));
app.use(cors());

app.get("/", (req, res) => {
    res.send("Hello, Gatherly!");
})

app.listen(PORT, () => {
    console.log(`server started on ${PORT}`);
})
  • 如果不是这种情况,则表示该事件存在。但由于'rows'是一个数组,所以即使它包含一个元素,我们也需要通过rows[0]来访问它。所以所需的行位于 rows[0] 中。
CREATE TABLE events (
  id SERIAL PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  description TEXT,
  start_time TIMESTAMP NOT NULL,
  end_time TIMESTAMP,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
  • 瞧!您现在可以成功获取特定活动的详细信息!这是完整的代码:
DATABASE_URL="postgresql://username:password@host:port/dbname"

用户注册

苏帕贝斯

要实现此功能,您需要先在 Supabase 中创建一个新表。

转到 SQL 编辑器并运行以下查询:

const { Pool } = require('pg');
require('dotenv').config();

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: {
    rejectUnauthorized: false
  }
});

module.exports = pool;

POST /事件/:id/注册

  • 我们可以在 try-catch 之外获取输入值以及参数值。
const pool = require('./db');
  • 现在我们首先检查带有“id”的事件是否存在。为此,我们将遵循 GET /event/:id 的方法,并检查 rows.length 是否非零,即它有一些结果。
app.get('/events', async (req, res) => {
  // code to be written
})
  • 现在事件已经存在,我们可以编写查询,将数据库中的注册实际添加到我们刚刚创建的新表中,即“registrations”。
try {
  // code to be written
} catch (e) {
  console.error(e);
  res.status(500).json({error: "Database error."}); // 500 = Internal Server Error
}
  • 因此,我们还实现了一项为用户注册活动的功能!这是完整的代码:
const result = await pool.query("SELECT * FROM events");

GET /event/:id/registrations :获取给定事件的所有注册

这是给你们的作业。 (别生气,如果你尝试了还是不行,GitHub 代码总是可用的)
提示:您可以像我们在 POST /event/:id/register 中那样检查事件是否存在。之后,您需要为注册表编写一个 SELECT 查询来获取具有给定 event_id 的所有行。

类似地,您也可以尝试构建一个端点来删除特定事件,例如 DELETE /event/:id 。

总结

恭喜!您已成功创建自己的 API,用于安排活动和管理用户注册。你已经走了很长的路。

您可以添加更多功能,例如添加 cron 作业,以便自动删除 end_time 已过的事件。

如果您喜欢这篇文章,请点赞,如果您有任何疑问或只是想与此相关的聊天,请发表评论。也可以在 LinkedIn 上关注我:https://www.linkedin.com/in/amartya-chowdhury/

以上是使用 Express 和 Supabase 创建您自己的事件调度 API的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn