You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lighthouse中GraphQL Enum无法设置null默认值的问题咨询

在Lighthouse中为枚举类型输入字段设置null默认值的问题解决

问题场景

在Lighthouse中定义并注册了PHP枚举类型:

<?php

use GraphQL\Type\Definition\Description;

#[Description(description: 'Size')]
enum Size: string
{
    case M = 'm';
    case L = 'l';
}

通过服务提供者完成注册:

$typeRegistry->register(new PhpEnumType(Size::class));

尝试在GraphQL输入类型中为枚举字段设置null默认值:

input SomeInput {
    mySize: Size = null
    someOtherArgment: String = null
}

调用对应突变时触发错误:

"message": "Undefined property: GraphQL\Language\AST\NullValueNode::$value",
"exception": "ErrorException",
"file": "/var/www/html/vendor/nuwave/lighthouse/src/Schema/AST/ASTHelper.php",
"line": 166,

直接传入null值可正常工作,仅设置null为默认值时报错。

无需修改源码的替代方案

方案1:在业务逻辑中处理默认值

移除输入字段的默认值定义:

input SomeInput {
    mySize: Size
    someOtherArgment: String
}

在处理输入的Resolver或业务代码中,判断字段是否存在,若不存在则手动设置为null:

// 示例Resolver逻辑
public function resolve($root, array $args)
{
    $input = $args['input'];
    $input['mySize'] = $input['mySize'] ?? null;
    // 后续业务处理
}

方案2:自定义Lighthouse指令处理null默认值

创建自定义指令规避AST解析问题:

  1. 生成指令类:
<?php

namespace App\GraphQL\Directives;

use Nuwave\Lighthouse\Schema\Directives\BaseDirective;
use Nuwave\Lighthouse\Schema\Values\FieldValue;
use Nuwave\Lighthouse\Support\Contracts\FieldMiddleware;

class DefaultNullDirective extends BaseDirective implements FieldMiddleware
{
    public static function definition(): string
    {
        return /** @lang GraphQL */ <<<'GRAPHQL'
directive @defaultNull on INPUT_FIELD_DEFINITION
GRAPHQL;
    }

    public function handleField(FieldValue $fieldValue): void
    {
        $resolver = $fieldValue->getResolver();
        $fieldValue->setResolver(function ($root, array $args) use ($resolver) {
            $inputName = $this->directiveArgValue('inputName') ?? 'input';
            if (isset($args[$inputName]) && !array_key_exists($this->fieldName(), $args[$inputName])) {
                $args[$inputName][$this->fieldName()] = null;
            }
            return $resolver($root, $args);
        });
    }
}
  1. 在config/lighthouse.php中注册指令:
'directives' => [
    'defaultNull' => \App\GraphQL\Directives\DefaultNullDirective::class,
],
  1. 在输入类型中使用指令:
input SomeInput {
    mySize: Size @defaultNull
    someOtherArgment: String @defaultNull
}

是否属于Lighthouse的Bug

这确实是Lighthouse的AST解析逻辑Bug。NullValueNode作为GraphQL AST的节点类型,本身不包含$value属性,但ASTHelper.php第166行代码试图访问该属性,导致报错。你可以在Lighthouse的GitHub仓库提交Issue,描述问题及复现步骤,等待官方后续版本修复。

内容的提问来源于stack exchange,提问作者Arno van Oordt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 01:22:26