NodeJS 如何在混音JS中拥有一个请求作用域变量?

svmlkihl  于 2023-02-03  发布在  Node.js
关注(0)|答案(1)|浏览(89)

我刚开始混音Js,想知道什么是最好的方法来完成这件事。
我有一个应用程序,它调用一个函数,该函数反过来调用一个API来加载用户详细信息。这些用户信息用于绘制多个东西,如页眉,页脚,并为用户加载适当的视图。
我注意到的是,目前对于来自浏览器的单个页面加载请求,函数(进而API)由呈现页眉,页脚,页面等。我想知道的是,是否有可能将用户详细信息保存在变量中,以便对于单个请求,所有模块都可以使用此变量,并且每次只需要获取一次浏览器请求。
我尝试了以下方法,但没有成功

let userDetails;

export function getUserDetails(userId){

  if(!userDetails){ 
     console.log("Calling API to fetch user details);
     //call the API
     userDetails = async getUserById(userId);
  }
  return userDetails;
}

我们可以选择在浏览器/会话中保存用户详细信息,但由于某些政策,这是不允许的。实现这一点的最佳方法是什么,这样我们只需要从浏览器的每个请求调用一次API,并保存后续调用,以便单个页面加载获取相同的信息?
TLDR:在混音服务器模块中初始化一个对象的最佳方法是什么,这样它的值就可以被其他模块访问,并且它只需要在浏览器的每个请求中设置一次。

0mkxixxg

0mkxixxg1#

Dataloader可用于解决此问题。
它提供请求级缓存(和批处理),这意味着初始HTML请求上的并行加载器可以在保持独立的同时进行协作。
使用混音的示例可以是found here

// Root.tsx
export const loader = async ({ context }) => {
  const user = await context.loaders.userById.get("user_1");
  return json({ user });
}

// ...

// Child.tsx
export const loader = async ({ context }) => {
  // This will await the same promise created in the Root.tsx loader
  const user = await context.loaders.userById.get("user_1");
  return json({ user });
}

// ...

话虽如此,我还是要警告一下,dataloader的抽象成本相当高,只有在您实在负担不起多次调用API的情况下才使用它(加载器并行运行,因此这更像是上游加载超过性能的问题)。
还值得注意的是,SPA导航不会看到好处,因为每个加载程序都是作为来自浏览器的单独请求调用的,因此请求级缓存将是无效的。

相关问题