繁体   English   中英

如何在 Express GraphQL 中的 2 个解析器函数之间共享数据?

[英]How can I share data between 2 resolver functions in Express GraphQL?

我有 2 个查询和相应的函数,但是在编写解析器时,我不确定如何存储第一个函数数据,然后在第二个函数中重用它。 注意:我不想再次调用 function,因为它将再次执行并且有一个内联 API 调用。 我只想在 express js 的全局 state 上像 session 一样使用它。 这是代码:

const resolvers={
    getStudent:async({id})=>{
        const resp=await service(id)
        return resp;
    },
    
    const courseDetails:()=>{
        console.log(resp)// I want to access resp object from above func., But don't want to call getStudent again
    }
}

我尝试了上下文但没有用。

您可以实现一个简单的内存存储。 通过存储Promise并返回它,您无需担心对相同资源的多个请求。

const got = require('got');
const assert = require('assert');

function studentServiceFactory(options = {}) {
    const TTL = options.ttl || 60 * 60 * 5; // default 5 min ttl
    const BASE_API = "https://swapi.dev/api";
    const store = {};

    return {
        get: ({ id }) => {
            if(!store[id] || store[id].timestamp + TTL < Date.now()) {
                // store the promise
                store[id] = {
                    promise: got(`${BASE_API}/people/${id}`),
                    timestamp: Date.now(),
                };
                console.log(`${BASE_API}/people/${id}`);
            }
            return store[id].promise;
        }
    }
}

const studentService = studentServiceFactory({ ttl: 1000});
const resolvers = {
    studentService: studentService,
};


// test program
(async () => {
    const request1 = await resolvers.studentService.get({ id: 1 });
    const request2 = await resolvers.studentService.get({ id: 1 });
    // Both calls will return the same promise.

    assert.equal(request1, request2);

    // wait for resources to get stale 
    setTimeout(async() => {
        const request3 = await resolvers.studentService.get({ id: 1 });
        assert.notEqual(request1, request3);
    }, 3000);

})();

两个请求相互独立。 在两个请求之间共享数据的唯一方法是将数据保存在某个地方。 它可以是文件、数据库等。在您的情况下,您可以简单地在另一个解析器中再次调用服务 function。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM