建造APOD彩色搜索部分III:DENO搜索APIð
#javascript #网络开发人员 #showdev #deno

如果您正在关注,这是关于我构建APOD color search的系列中的第三部分。

简单搜索APIð

这是为/search端点提供动力以检查缓存以上搜索结果的层,如果没有,则查询预处理的数据库并存储在缓存中。它是用Deno编写的,并使用Deno Deploy不断部署。

为什么要丹诺? ð

我喜欢Deno的原因有多种原因,但首先是:它是 fast 。本机TS支持也不错,DENO部署是快速(免费)的托管服务。总体而言,与之合作的感觉很棒,非常适合小型项目。

尽管对于该项目而言,我还是决定使用fresh,因为它提供了一些基本的路由和脚手架。我也有一个有用的supabase Deno package来查询数据库。

查找颜色匹配ð -

为了简化/search端点,查询作为路由参数包含在URL中。这是实用的,因为唯一相关的查询是六个字符串,是十六进制的颜色(例如/search/:hex)。

在新鲜的,这样的动态路线是使用该路线期望的目录下的文件名[param].ts创建的,并且在请求中,该值将以此名称添加到上下文中。因此,就我而言,这意味着一个名为search的目录,其中包含一个名为[hex].ts的文件。

现在,让我们添加一个简单的处理程序以从上下文中获取hex参数并返回一个空响应:

export const handler = async (
  _req: Request,
  ctx: HandlerContext,
): Promise<Response> => {
  const { hex } = ctx.params;

  ...

  const data = [];

  return new Response(JSON.stringify({ data }), {
    status: 200,
    headers: { "Content-Type": "application/json" },
  });
}

很棒,现在返回通过image analysis from before产生的结果! (在那里描述了数据结构,并且将使该部分更加清晰。)

首先,我们需要与数据库的连接。假设这些凭据存储在.env中:

import "https://deno.land/x/dotenv@v3.2.0/load.ts";
import { createClient } from "https://esm.sh/@supabase/supabase-js@1.35.4";

const supabase = createClient(
  Deno.env.get("SUPABASE_URL") as string,
  Deno.env.get("SUPABASE_PUBLIC_API_KEY") as string,
);

然后,一旦我们将十六进制值转换回RGB,我们就可以在colors表上执行多个过滤器的查询串在一起,以在输入颜色的一定阈值中获得颜色:

const THRESHOLD = 30;
const [r, g, b] = hexToRgb(hex);

const { data: colors } = await supabase
  .from("colors")
  .select()
  .gt("r", r - THRESHOLD)
  .lt("r", r + THRESHOLD)
  .gt("g", g - THRESHOLD)
  .lt("g", g + THRESHOLD)
  .gt("b", b - THRESHOLD)
  .lt("b", b + THRESHOLD);

这将为我们提供(长)的颜色列表,但是通过比较红色,绿色和蓝色颜色值,可以通过原始距离与原始搜索颜色进行排序的clusters列表:

const { data: clusters } = await supabase
  .from("clusters")
  .select()
  .in("color_id", colors?.map(({ id }) => id))
  .limit(15);

clusters.sort((a, b) => minimizeDistance(a, b));

上面的minimizeDistance函数的来源可以在utils.ts中找到。最后,一旦找到了最相关的群集,我们可以返回实际的apod:

const { data } = await supabase
  .from("days")
  .select()
  .in("id", clusters?.map(({ day_id }) => day_id))
  .limit(5);

return new Response(JSON.stringify({ data }), {
  status: 200,
  headers: { "Content-Type": "application/json" },
});

成功!如果您想使用它,则将此API部署为here。这是DENO部署的项目,由部署的Fe。

使用

缓存结果ð

如前所述,还有一个缓存层,可以防止不必要/重复的请求强制昂贵的数据库查询。我使用Redis Enterprise Cloud的免费层。