我在用RedwoodJS。
我的前端(他们称之为"web“"side")有一个HomePage.ts和MainCell.ts (以及其他文件),然后MainCell中的成功函数调用第三方API。
一切都正常。
但是,我现在想开始缓存来自第三方API的结果。
我创建了一个数据库表和一个名为cachedQueries.ts (使用Prisma)的后端“服务”,其中包括:
export async function getFromCacheOrFresh(key: string, getFresh: Function, expiresInSec: number): Promise<any> {
const nowMoment = dayjs.utc();
const nowStr = nowMoment.format(dbTimeFormatUtc);
const cached = await getCachedQuery({ key, expiresAtCutoff: nowStr });
console.log('getFromCacheOrFresh cached', cached);
if (cached) {
const cachedValueParsed = JSON.parse(cached.value);
console.log('cachedValueParsed', cachedValueParsed);
return cachedValueParsed;
} else {
const fresh = await getFresh();
saveToCache(key, JSON.stringify(fresh), expiresInSec);
return fresh;
}
}我已经证明了这个cachedQueries.ts服务可以工作,并正确地保存到数据库并从DB中检索。也就是说,对于可以从后端(而不是从前端)调用的任何第三方API,流都能很好地工作。
现在我的挑战是让它也能缓存前端第三方API查询.
如何从前端的getFromCacheOrFresh成功函数调用函数?
我一定对阿波罗、GraphQL、RedwoodJS、Prisma等人的关系感到困惑。
客户端缓存是不够的。我真的需要第三方API结果保存在我的服务器上的DB中。
发布于 2020-12-19 22:08:19
,我终于想出来了。
我创建了一个名为GeoCell的新单元格,并为GeoCell的每个函数(Success、Loading、Empty和Failure)返回一个空字符串。
感觉很奇怪但很管用。
对我来说,不直观的是,我被要求使用JSX组件(因为阿波罗从不允许我在JSX组件之外查询或变异GraphQL ),但我不希望单元组件实际显示任何…。因为它在Success中所需要做的就是调用一个助手函数,该函数会影响由不同单元格创建的元素aleady (即,addMarkerAndInfoWindow会影响现有Google的div,但不会显示GeoCell实际所在的任何位置)。
正如https://stackoverflow.com/a/65373314/470749提到的,在红木社区论坛:思考服务模式,GraphQL,阿波罗,细胞等上有一个相关的讨论。
https://stackoverflow.com/questions/64469000
复制相似问题