Graphql 如果字段为空,阿波罗客户端网络错误

Graphql 如果字段为空,阿波罗客户端网络错误,graphql,apollo-client,Graphql,Apollo Client,这个特定的代码已经运行了几个月没有问题了,今天早上,没有任何相关的变化,我可以在我们的设置或我们的代码中找到我开始接收 ERROR Error: Uncaught (in promise): Error: Network error: Cannot convert undefined or null to object Error: Network error: Cannot convert undefined or null to object at new ApolloError (

这个特定的代码已经运行了几个月没有问题了,今天早上,没有任何相关的变化,我可以在我们的设置或我们的代码中找到我开始接收

ERROR Error: Uncaught (in promise): Error: Network error: Cannot convert undefined or null to object Error: Network error: Cannot convert undefined or null to object
    at new ApolloError (ApolloError.js:43)
    at eval (QueryManager.js:324)
    at eval (QueryManager.js:755)
    at Array.forEach (<anonymous>)
    at eval (QueryManager.js:754)
    at Map.forEach (<anonymous>)
    at QueryManager.broadcastQueries (QueryManager.js:749)
    at eval (QueryManager.js:251)
    at ZoneDelegate.invoke (zone.js:388)
    at Object.onInvoke (core.js:4733)
    at new ApolloError (ApolloError.js:43)
    at eval (QueryManager.js:324)
    at eval (QueryManager.js:755)
    at Array.forEach (<anonymous>)
    ...
    inline.bundle.js:26 (anonymous) @ main.bundle.js:1
错误是:

"Cannot convert undefined or null to object"
从此处调用merge:

function executeSelectionSet(selectionSet, rootValue, execContext) {
    var fragmentMap = execContext.fragmentMap, contextValue = execContext.contextValue, variables = execContext.variableValues;
    var result = {};
    selectionSet.selections.forEach(function (selection) {
        if (!shouldInclude(selection, variables)) {
            // Skip this entirely
            return;
        }
        if (isField(selection)) {
            var fieldResult = executeField(selection, rootValue, execContext);
            var resultFieldKey = resultKeyNameFromField(selection);
            if (fieldResult !== undefined) {
                if (result[resultFieldKey] === undefined) {
                    result[resultFieldKey] = fieldResult;
                }
                else {
                    merge(result[resultFieldKey], fieldResult);
                }
            }
        }
        else {
            var fragment = void 0;
            if (isInlineFragment(selection)) {
                fragment = selection;
            }
            else {
                // This is a named fragment
                fragment = fragmentMap[selection.name.value];
                if (!fragment) {
                    throw new Error("No fragment named " + selection.name.value);
                }
            }
            var typeCondition = fragment.typeCondition.name.value;
            if (execContext.fragmentMatcher(rootValue, typeCondition, contextValue)) {
                var fragmentResult = executeSelectionSet(fragment.selectionSet, rootValue, execContext);
                merge(result, fragmentResult);
            }
        }
    });
    if (execContext.resultMapper) {
        return execContext.resultMapper(result, rootValue);
    }
    return result;
}
在我确定了正在解析的字段以及该字段在后端是空值的事实之后,我尝试更改该值,然后错误移动到同一节点的下一个空值字段。我还尝试了其他查询,得到了相同的结果

我们在后端使用django和graphene,在前端使用apollo客户端


如果您能在这里有所了解,我将不胜感激。我仍在努力了解从昨天23:00(最近一次我测试了现在正在轰炸的代码,并且一切正常)到今晚1:00(在我们的开发服务器上进行自动部署的时间)之间发生了什么变化。

我昨晚遇到了一个类似的错误,对我来说,我能够追踪到包中的一个变化,从版本4.1.8到版本4.1.9(2天前更新)

以下是更改日志:


在我的package.json文件中添加
“graphql anywhere”:“4.1.8”
,解决了我的应用程序的问题

谢谢!我将验证这是否也为我们解决了问题。目前,我不得不重写所有的解析以防止出现空值。看起来新版本(4.1.10)已经解决了这个问题:作为一个副作用,它让我检查了服务器端代码。这总是一件好事:D
function executeSelectionSet(selectionSet, rootValue, execContext) {
    var fragmentMap = execContext.fragmentMap, contextValue = execContext.contextValue, variables = execContext.variableValues;
    var result = {};
    selectionSet.selections.forEach(function (selection) {
        if (!shouldInclude(selection, variables)) {
            // Skip this entirely
            return;
        }
        if (isField(selection)) {
            var fieldResult = executeField(selection, rootValue, execContext);
            var resultFieldKey = resultKeyNameFromField(selection);
            if (fieldResult !== undefined) {
                if (result[resultFieldKey] === undefined) {
                    result[resultFieldKey] = fieldResult;
                }
                else {
                    merge(result[resultFieldKey], fieldResult);
                }
            }
        }
        else {
            var fragment = void 0;
            if (isInlineFragment(selection)) {
                fragment = selection;
            }
            else {
                // This is a named fragment
                fragment = fragmentMap[selection.name.value];
                if (!fragment) {
                    throw new Error("No fragment named " + selection.name.value);
                }
            }
            var typeCondition = fragment.typeCondition.name.value;
            if (execContext.fragmentMatcher(rootValue, typeCondition, contextValue)) {
                var fragmentResult = executeSelectionSet(fragment.selectionSet, rootValue, execContext);
                merge(result, fragmentResult);
            }
        }
    });
    if (execContext.resultMapper) {
        return execContext.resultMapper(result, rootValue);
    }
    return result;
}