Apollo Server docs state:

Resolvers should never destructively modify the contextValue argument.这可确保所有解析器之间的一致性,并防止意外错误.

我想找人帮我把这份报表拆开.

  1. 我想"永不 destruct 性修改"的意思是您可以在上下文中添加属性,但不能删除或更改它们?
  2. "确保所有解析器的一致性"我猜是指并行处理query个解析器的情况,以至于上下文值可能在执行过程中意外更改.但是,串联处理的mutation个解析器怎么办?在这种情况下,改变上下文是否安全?

我的问题是:

  1. 作为上下文初始化函数的一部分,我加载经过身份验证的用户.
  2. 我将用户对象放入要由解析器使用的上下文中.
  3. 我有一个setUserDetails的Mutations ,可以更新用户.
  4. 如果我运行具有两个Mutations 的查询(例如,setUserDetailssendWelcomeEmail),则第二个Mutations 看到的是原始用户详细信息,而不是更新的用户详细信息unless I mutate the context.

这会导致"意外错误",这是我们一开始就试图避免的事情.

所以我的问题是:在Mutations 解析器中Mutations 上下文可以吗?或者,有没有其他推荐的方法来避免这个问题?

推荐答案

您似乎非常清楚更改上下文值可能会引发的问题.我认为这些文件的目的是防止人们利用语境来传递价值观.我认为,理想情况下,上下文只创建一次,然后永远不会修改.

我认为在您的情况下,您的上下文还在某种程度上充当缓存(这并不少见),所以我认为在更新之后使缓存条目无效或更新缓存条目应该没有问题.

然而,我会考虑以下几点:

  • "sendWelcomeEmail"真的应该是一个独立的变体吗?也许您的API可以进行不同的设计.我推荐Mark-Andre's writing个.
  • 我假设您并没有真正"缓存"值,但这可能只是当前用户的情况.明智的做法是,只在上下文中存储一些永远不会更改的属性(例如,在我们的API中,我们有{ id: 1, companyId: 2, role: 'USER' }个属性,当我们需要时,从数据库加载其他所有属性.如果您从解析器中的数据库加载邮箱,您的Mutations 可能很少被调用,并且不会显着减慢.

Javascript相关问答推荐

如何将拖放功能添加到我已自定义为图像的文件输入HTML标签中?

在分区内迭代分区

Vega中的模运算符

如何最好地从TypScript中的enum获取值

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

第三方包不需要NODE_MODULES文件夹就可以工作吗?

如何在Node.js中排除导出的JS文件

使用带有HostBinding的Angular 信号来更新样式?

VSCode中出现随机行

JavaScript不重定向配置的PATH

FileReader()不能处理Firefox和GiB文件

处理app.param()中的多个参数

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

用于测试其方法和构造函数的导出/导入类

如果NetSuite中为空,则限制筛选

JavaScript&;Reaction-如何避免在不使用字典/对象的情况下出现地狱?

JQuery使用选项填充HTMLSELECT并设置默认结果,默认结果显示为空

Played link-Initialize.js永远显示加载符号

使用Java脚本替换字符串中的小文本格式hashtag

正在发出错误的URL请求