graphql学习(三)

简介:

GraphQL中有三种操作类型,分别是query、mutation、subscription:

  • query: 获取数据,对应CRUD里的R;
  • mutation: 操作数据,对应CRUD里的CUD(创建,更新,删除);
  • subscription: 消息订阅,数据更改时进行消息推送.

之前已经学习了query, 这一篇重点学习mutation.

首先,修改models/article.go文件,增加相应的CUD函数:

// Create a new article with the title and content provided
func CreateNewArticle(title, content string) (*Article, error) {
    // Set the ID of a new article to one more than the number of articles
    a := Article{ID: len(articleList) + 1, Title: title, Content: content}

    // Add the article to the list of articles
    articleList = append(articleList, a)

    return &a, nil
}

// Update a article
func UpdateArticle(id int, title, content string) (*Article, error) {
    a, err := GetArticleByID(id)
    if err != nil {
        return nil, err
    }

    if title != "" {
        a.Title = title
    }
    if content != "" {
        a.Content = content
    }

    return a, nil
}

// Delete a article
func DeleteArticle(id int) error {
    for k, a := range articleList {
        if a.ID == id {
            articleList = append(articleList[:k], articleList[k+1:]...)
            return nil
        }
    }
    return errors.New("Article not found")
}

然后是修改schema/article.go,增加相应的mutation:

// 定义mutation,增删改操作
// add
var addArticle = graphql.Field{
    Name:        "新文章",
    Description: "增加新文章",
    Type:        articleType,
    Args: graphql.FieldConfigArgument{
        "title": &graphql.ArgumentConfig{
            Type: graphql.String,
        },
        "content": &graphql.ArgumentConfig{
            Type: graphql.String,
        },
    },
    Resolve: func(p graphql.ResolveParams) (result interface{}, err error) {
        title, _ := p.Args["title"].(string)
        content, _ := p.Args["content"].(string)

        result, err = models.CreateNewArticle(title, content)
        if err != nil {
            return nil, err
        }

        return result, nil
    },
}

// update
var updateArticle = graphql.Field{
    Name:        "编辑文章",
    Description: "编辑文章",
    Type:        articleType,
    Args: graphql.FieldConfigArgument{
        "id": &graphql.ArgumentConfig{
            Type: graphql.Int,
        },
        "title": &graphql.ArgumentConfig{
            Type: graphql.String,
        },
        "content": &graphql.ArgumentConfig{
            Type: graphql.String,
        },
    },
    Resolve: func(p graphql.ResolveParams) (result interface{}, err error) {
        id, _ := p.Args["id"].(int)
        title, _ := p.Args["title"].(string)
        content, _ := p.Args["content"].(string)

        result, err = models.UpdateArticle(id, title, content)
        if err != nil {
            return nil, err
        }

        return result, nil
    },
}

// delete
var deleteArticle = graphql.Field{
    Name:        "删除文章",
    Description: "删除指定Id的文章",
    Type:        articleType,
    Args: graphql.FieldConfigArgument{
        "id": &graphql.ArgumentConfig{
            Type: graphql.Int,
        },
    },
    Resolve: func(p graphql.ResolveParams) (result interface{}, err error) {
        id, _ := p.Args["id"].(int)

        // 查找文章是否存在
        result, err = models.GetArticleByID(id)
        if err != nil {
            return nil, err
        }

        if err = models.DeleteArticle(id); err != nil {
            return nil, err
        }

        return result, nil
    },
}

// 定义增删改方法
var mutationType = graphql.NewObject(graphql.ObjectConfig{
    Name:        "mutation",
    Description: "增删改",
    Fields: graphql.Fields{
        "add":    &addArticle,
        "update": &updateArticle,
        "delete": &deleteArticle,
    },
})

// 定义Schema用于http handler处理
var Schema, _ = graphql.NewSchema(graphql.SchemaConfig{
    Query:    rootQuery,
    Mutation: mutationType,   // 这里不能是nil了,对应前面的定义
})

测试结果话不多说,上图:
新增文章:
image

编辑文章
image

删除文章
image

代码在github上的链接
传送门

目录
相关文章
|
移动开发 小程序 JavaScript
uVeiw Parse 富文本解析器
uVeiw Parse 富文本解析器
333 1
|
人工智能 供应链 Linux
《国产服务器操作系统发展报告(2023)》重磅发布
根据近期信通院面向用户群体的调研显示,国产服务器操作系统逐渐成为各行业替换首选,其中,龙蜥操作系统位列用户意愿迁移系统的首位。
|
JavaScript 开发工具 C++
探索 Visual Studio Code:开发者的多功能编辑器
Visual Studio Code(VS Code)是由微软开发的一款免费、开源的轻量级代码编辑器,支持 Windows、Linux 和 macOS。它内置了对多种编程语言的支持,并提供了代码高亮、智能补全、调试和 Git 集成等功能。VS Code 的强大之处还在于其丰富的插件生态系统,通过安装插件可以进一步扩展功能。此外,用户还可以通过定制设置来自定义编辑器的行为和外观,从而提升开发效率。本文将详细介绍 VS Code 的核心特性、推荐插件及定制化设置方法。
|
9月前
|
Web App开发 移动开发 前端开发
如何创建一个学校网站?
搭建教育网站需要确定核心功能,根据学校特色定位风格,并规划网站功能和框架。内容规划需优先展示高频需求,定期更新,选择合适的建站工具和安全防护措施。
256 7
|
11月前
|
监控 安全 算法
龙蜥衍生版KeyarchOS国密应用、eBPF安全技术实践介绍|龙蜥大讲堂107期
龙蜥衍生版KeyarchOS国密应用及eBPF安全技术实践介绍。本次分享由浪潮信息的霍文和甄鹏主讲,涵盖全栈国密、国密密钥证书、国密通信等内容,并介绍了基于eBPF技术的新一代零侵入安全防御组件KSecure。通过实际案例展示了敏感信息传输加密、虚拟机热迁移等应用场景,以及如何利用eBPF实现进程注入检测等安全功能。该技术方案有效提升了操作系统的安全性与合规性,为服务器提供了强大的安全保障。
309 12
龙蜥衍生版KeyarchOS国密应用、eBPF安全技术实践介绍|龙蜥大讲堂107期
|
敏捷开发 测试技术 持续交付
阿里云云效产品使用合集之怎么批量导出任务
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
11月前
|
人工智能 算法 机器人
专访汶生|或许你没有听过具身智能实训,但是已经有人这样做了
汶生在2023年底创办TsingtaoAI公司之前,就已经深入具身智能高校实训领域和AI人才培养方面。最近一年,汶生带领核心技术团队完成了具身智能高校实训解决方案、AI Agent应用开发实训解决方案和华为昇腾910B算力卡的大模型部署和调优实训方案。这些方案赋能与高校CS/AI专业的实训和企业IT/AI员工的内训,通过前沿技术和实训解决方案的结合,让学习者可以迅速掌握AI/具身智能/智算行业的核心和前沿技术。
262 10
|
人工智能 移动开发 前端开发
通义灵码使用实践场景、效果和心得。
作为一名H5前端开发学者,我在学习过程中借助通义灵码@workspace大幅提升了效率。通过自动推荐匹配的CSS样式和项目内相似模板的排版建议,减少了重复劳动,效率提高超过一倍。此外,它还能解析并翻译GitHub上的英文.md文件,如成功部署声音合成AI:GPT-SoVITS项目,极大便利了我的学习与开发工作。
453 4
|
前端开发 JavaScript API
使用GraphQL进行数据查询和管理
使用GraphQL进行数据查询和管理
515 0
|
存储 机器学习/深度学习 安全
阿里云服务器价格参考,2000元预算可购买的云服务器配置及价格
2000元左右预算可以买到哪些配置的阿里云服务器?目前阿里云活动中价格在3000元左右的云服务器有22款,其中经济型e实例3款,通用算力型u1实例9款,计算型c7实例1款,通用型g7实例1款,内存型r7实例1款,倚天云服务器6款,本文将为您解读3000元预算目前在阿里云的活动中可购买到的阿里云服务器配置及具体价格。