首页 > 解决方案 > KeystoneJS 'resolveInput' 字段挂钩:从字段挂钩返回 'resolvedData' 会产生 GraphQL 转换错误

问题描述

我正在尝试在 KeystoneJS 5 中修改保存特定字段的数据。resolveInput字段挂钩似乎是一个很好的方法。这是上面文档中给出的示例:

const resolveInput = ({
  operation,
  existingItem,
  originalInput,
  resolvedData,
  context,
  actions,
}) => {
  // Input resolution logic
  // Object returned is used in place of resolvedData
  return resolvedData;
};

resolveInput 的返回可以是 Promise 或 Object。它应该解析为与 resolvedData 相同的结构。结果按执行顺序传递给下一个函数。

因此,我列表中字段的定义是

text: {
                type: Wysiwyg,
                hooks: {
                    async resolveInput({ originalInput,resolvedData }) {
                        console.log('resolvedData');
                        console.log(resolvedData);
                        return resolvedData;
                    }
                }

并且开始我只是返回resolvedData传入的参数,根据文档是

resolvedData    Object  The data received by the GraphQL mutation plus defaults values

但是,我每次都会收到以下错误

GraphQLError
Cast to string failed for value "{ text: '<p><img src="static/blop.jpg" alt="" width="580" height="388" /><img src="static/blop.jpg" alt="" /></p>' }" at path "text"

我不确定问题是什么或如何解决它——我只是返回传入的相同数据。当我移除钩子时,一切正常。

编辑

我相信答案是不会返回整个resolvedData对象,而是返回您所在的对象上的字段。因此,在下面的情况下,一个会返回resolvedData.text(或resolvedData.title)。我相信文档可以改进,因为它似乎返回了整个resolvedData对象。

标签: graphqlkeystonejs

解决方案


你是对的:根据@keystonejs/keystone/lib/List/index.js 中的代码,应该从resolveInput挂钩返回字段对象而不是整个resolvedData对象:

    // Run the schema-level field hooks, passing in the results from the field
// type hooks
resolvedData = {
  ...resolvedData,
  ...(await this._mapToFields(
    this.fields.filter(field => field.hooks.resolveInput),
    field => field.hooks.resolveInput({ ...args, resolvedData })
  )),
};

返回值分配给定义了resolveInput挂钩的resolvedData对象内的字段元素。


推荐阅读