仅对一个或多个服务使用RESTful CRUD

仅对一个或多个服务使用RESTful CRUD,rest,feathersjs,feathers-sequelize,Rest,Feathersjs,Feathers Sequelize,如果我有一个简单的数据结构,只需要一个服务(formular)来处理其他表(formgroups、fields)中的相关数据 如何区分是更新操作还是在结构中插入新数据的创建操作?(通过id之类的东西,它是否为空?) 使用一个或多个服务 数据结构: { "id": 7 "name": "Formular name", "formgroups": [ { &

如果我有一个简单的数据结构,只需要一个服务(formular)来处理其他表(formgroups、fields)中的相关数据

  • 如何区分是更新操作还是在结构中插入新数据的创建操作?(通过id之类的东西,它是否为空?)
  • 使用一个或多个服务
  • 数据结构:

    {
        "id": 7
        "name": "Formular name",
        "formgroups": [
            {
                "id": 28,
                "formularId": 7
                "name": "General",
                "fields": [
                    { "name": "Firstname", "id":107, "formgroupId":28 },
                    { "name": "Lastname", "id":108, "formgroupId":28 },
                    { "name": "Birthdate", "id":111, "formgroupId":28 }
                ]
            },
            {
                "name": "Address; new group with new fields",
                "fields": [
                    { "name": "Street"},
                    { "name": "Zip"},
                    { "name": "Country"}
                ]
            },
            {
                "name": "Additions",
                "fields": [
                    { "name": "First Line"},
                    { "name": "Second Line"}
                ]
            }
        ]
    }
    
    如果只使用一个服务(/formular),我会将整个数据结构发送给它,并且需要区分具有id的元素,这样它就会进行更新查询,或者如果没有,则创建具有相关“父”-id的记录

    在一个服务中这样做会损害单一责任原则。因为我的公式化服务中有来自formgroup和field的逻辑

    此外,我不确定挂钩前后是否还会继续使用羽毛。他们可能绕过了

    如果使用多个服务(/formular、/formgroup、/field),则执行相同的id检查,但客户端应用程序使用PUT/PATCH或POST向每个服务分派

    补丁/公式/7

    补丁/表单组/28

    补丁/字段/108

    POST/formgroup(使用公式id 7插入,并为下一个字段插入获取公式组id 29)

    邮政/字段(插入带有表单组id 29的“街道”)

    POST/字段(插入表单组id为29的“Zip”)

    但这看起来不对。提出了这么多要求。也许对每个新创建的formular/formgroup/field立即这样做是一种解决方案,而不是一次保存整个数据结构

    第三种方式可能是拥有所有服务,但永远不要公开所有服务。将hole数据结构发送到/formular服务,其中该服务在内部调用其他服务/formgroup和/field以进行CRUD操作。 但我不知道这是否仍然适用于hooks部分和feathers sequelize功能

    实体关系模型:

    {
        "id": 7
        "name": "Formular name",
        "formgroups": [
            {
                "id": 28,
                "formularId": 7
                "name": "General",
                "fields": [
                    { "name": "Firstname", "id":107, "formgroupId":28 },
                    { "name": "Lastname", "id":108, "formgroupId":28 },
                    { "name": "Birthdate", "id":111, "formgroupId":28 }
                ]
            },
            {
                "name": "Address; new group with new fields",
                "fields": [
                    { "name": "Street"},
                    { "name": "Zip"},
                    { "name": "Country"}
                ]
            },
            {
                "name": "Additions",
                "fields": [
                    { "name": "First Line"},
                    { "name": "Second Line"}
                ]
            }
        ]
    }
    

    我的测试项目的Sourceode可以在这里找到:

    有关应用程序的其他信息: 我的申请分为两部分

  • 运行feathersjs并为REST API提供服务的服务器应用程序
  • 在浏览器中运行的客户端SPA调用API
  • 问题: 如何在FeatherJS服务、钩子、sequelize关系和RESTful API方面做到这一点?

    您使用的是“服务”,大多数人会根据上下文使用“资源”、“端点”或(更一般地说)“模块”。不太可能帮到你

    第三种方法可能是拥有所有服务,但永远不要公开所有服务。将hole数据结构发送到/formular服务,其中该服务在内部调用其他服务/formgroup和/field以进行CRUD操作

    这种方法与REST最为一致

    中心思想是,您的“RESTAPI”是一个门面,使您的应用程序看起来像一个通用文档库(也称为网站)。希望向您发送信息的远程客户端通过建议对您网站上的资源进行编辑来实现

    网站上的每个文档都独立于其他文档,可以使用所有文档共有的自描述消息来建议对该文档进行编辑

    所以

    PUT /formular
    
    是一种非常合理的方式,可以向服务器建议它使其
    /formular
    的副本看起来像客户端的副本

    然后,服务器负责(a)确定如何更改其资源副本以响应请求,以及(b)确定如何进行这些更改

    因此,如果/formular是从多个表中的多行构建的资源,那么服务器需要自己确定需要哪些数据库语句来适当地更新这些表

    这种复杂性被故意隐藏在REST facade后面——就客户机而言,您只是将资源的新表示形式写入某个文件中


    就单一责任原则而言,请求处理者有一个责任——处理请求。您可能希望通过让请求处理程序将部分或全部工作委托给更简单的事情来实现这一点


    (例如,解析HTTP请求、生成HTTP响应等)

    我不知道挂钩或羽毛续集,因此我无法猜测它们可能会有什么帮助(或者它们可能会有什么阻碍)。谢谢。你的回答很有助于澄清问题。我脑子里有太多不同的东西,比如SOA、ORM、REST,通过相互映射将它们混合在一起,最终让我非常困惑,看不见了。多亏了你,现在一切都好了。