gpt4 book ai didi

javascript - 如何在 Apollo Server 中设置服务器端完整响应缓存

转载 作者:行者123 更新时间:2023-12-02 19:29:19 25 4
gpt4 key购买 nike

我正在尝试根据 this guide 设置缓存对于一个结果每天只改变一次的昂贵查询。该查询需要 7-8 秒,并且大多数是在数据库查询之后,因为从解析器返回的响应必须经过大量处理。

我正在使用 apollo-server-express 库,更改插件是 apollo-server-plugin-response-cache

这就是我所做的:

server.js

const { ApolloServer } = require('apollo-server-express')
const responseCachePlugin = require('apollo-server-plugin-response-cache')

const server = new ApolloServer({
typeDefs,
resolvers,
context: async ({ req }) => {
// ...
},
plugins: [responseCachePlugin()]
resolvers.js

personDetails: async (root, args, ctx, info) => {
info.cacheControl.setCacheHint({ maxAge: 600 })
const persons = await Person.find({}).populate('details')

// processing the data

return processedData
}

我希望解析器运行一次,然后响应应该几乎立即从缓存中返回。这是行不通的。我做错了什么或者我不明白这是如何工作的。

我尝试将缓存提示也放入架构中,但没有得到任何更好的结果。

最佳答案

它应该可以工作。这是一个工作示例:

server.ts:

import { ApolloServer, gql } from 'apollo-server-express';
import express from 'express';
import responseCachePlugin from 'apollo-server-plugin-response-cache';

const typeDefs = gql`
type Query {
personDetails: String
}
`;
const resolvers = {
Query: {
personDetails: async (root, args, ctx, info) => {
console.log(`[${new Date().toLocaleTimeString()}] Query.personDetails`);
info.cacheControl.setCacheHint({ maxAge: 10 });
return 'This is person details';
},
},
};

const app = express();
const apolloServer = new ApolloServer({
typeDefs,
resolvers,
plugins: [responseCachePlugin()],
});

apolloServer.applyMiddleware({ app });

const server = app.listen({ port: 4000 }, () => {
console.log(`The server is running in http://localhost:4000${apolloServer.graphqlPath}`);
});

请求日志:

The server is running in http://localhost:4000/graphql
[1:51:27 PM] Query.personDetails
[1:51:52 PM] Query.personDetails

响应头:

cache-control: max-age=10, public

第一个 graphql 请求于[1:51:27 PM]发送。在接下来的 10 秒内,所有发送的请求都将命中缓存(默认为内存中的 LRU 缓存),这意味着 graphql 解析器 personDetails 将不会执行。 graphql 响应将从缓存中读取并发送到客户端。

10 秒后,我在 [1:51:52 PM] 发送另一个 graphql 请求。缓存已过期。所以这个请求不会命中内存缓存。 graphql 解析器将执行并生成一个新值。

源代码:https://github.com/mrdulin/apollo-graphql-tutorial/tree/master/src/stackoverflow/57243105

关于javascript - 如何在 Apollo Server 中设置服务器端完整响应缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57243105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com