如果您正在关注,这是关于我构建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的免费层。