代码之家  ›  专栏  ›  技术社区  ›  smysnk

分析元数据时Breeze无声失败

  •  0
  • smysnk  · 技术社区  · 12 年前

    试图轻装上阵,但遇到了最糟糕的错误,这根本不是。我正在制作的元数据似乎没有被微风所接受。我知道目前元数据存在一些问题,例如“foreignKeyNamesServer”中的值不正确以及其他一些问题。我正在生成的元数据可以在此处查看(太大): http://pastebin.com/ycP4jXxn

    var serviceName = 'http://www.dockyard.com:8080/rest';
    var entityManager = new breeze.EntityManager({serviceName: serviceName});
    var entityQuery = new breeze.EntityQuery();
    var query = breeze.EntityQuery.from("application")
    
    entityManager.executeQuery(query)
        .then(function (data) {
            console.log(data);
        }, function (error) {
            console.log(error);
       });
    

    因此,我看到的行为是没有与元数据解析相关的javascript错误,元数据返回正常,返回200OK。命中/rest/application返回200OK,返回以下数据。

    [{"@id":1,"id":1,"name":"dsad","deploymentStrategies":null,"versions":null,"groups":null},{"@id":2,"id":2,"name":"sss","deploymentStrategies":null,"versions":null,"groups":null},{"@id":3,"id":3,"name":"fdsfs","deploymentStrategies":null,"versions":null,"groups":null},{"@id":4,"id":4,"name":"fdsa","deploymentStrategies":null,"versions":null,"groups":null},{"@id":5,"id":5,"name":"dasda","deploymentStrategies":null,"versions":null,"groups":null}]
    

    Promise正在调用错误回调:在填充metadataStore之前无法执行_executeQueryCore

    元数据存储的内容:

    {"namingConvention":{"name":"camelCase"},"localQueryComparisonOptions":{"name":"caseInsensitiveSQL","isCaseSensitive":false,"usesSql92CompliantStringComparison":true},"dataServices":[{"serviceName":"http://www.dockyard.com:8080/rest/","hasServerMetadata":true,"jsonResultsAdapter":"webApi_default","useJsonp":false}],"_resourceEntityTypeMap":{"platform":"Platform:#com.psidox.dockyard.controller.model.dockyard","application":"Application:#com.psidox.dockyard.controller.model.application","host":"Host:#com.psidox.dockyard.controller.model.host","groupdeploymentstrategy":"GroupDeploymentStrategy:#com.psidox.dockyard.controller.model.application","dockyard":"Dockyard:#com.psidox.dockyard.controller.model.dockyard","configurationentry":"ConfigurationEntry:#com.psidox.dockyard.controller.model","hoststrategy":"HostStrategy:#com.psidox.dockyard.controller.model.application","dockerimage":"DockerImage:#com.psidox.dockyard.controller.model.docker","version":"Version:#com.psidox.dockyard.controller.model.application","docker":"Docker:#com.psidox.dockyard.controller.model.docker","hostproviderconfig":"HostProviderConfig:#com.psidox.dockyard.controller.model.host","hostprovider":"HostProvider:#com.psidox.dockyard.controller.model.host","metadataimpl":"MetadataImpl:#com.psidox.dockyard.controller.model","deployment":"Deployment:#com.psidox.dockyard.controller.model.dockyard","hosttype":"HostType:#com.psidox.dockyard.controller.model.host","group":"Group:#com.psidox.dockyard.controller.model.application","groupimplementation":"GroupImplementation:#com.psidox.dockyard.controller.model.application","deploymentstrategy":"DeploymentStrategy:#com.psidox.dockyard.controller.model.dockyard","groupdeployment":"GroupDeployment:#com.psidox.dockyard.controller.model.application","metadata":"Metadata:#com.psidox.dockyard.controller.model"},"_structuralTypeMap":{},"_shortNameMap":{},"_ctorRegistry":{},"_incompleteTypeMap":{},"_incompleteComplexTypeMap":{},"_id":0,"_deferredTypes":{}}"
    

    我很确定这个错误与元数据存储没有从元数据中正确填充有关。只是想知道为什么Breeze在遇到无效元数据时不会抛出任何类型的错误?


    编辑:

    调试解析元数据调用后 Breeze Metadata Schema Documentation 已过期。乍一看,这是一个变化:

    • 键名“structuralTypeMap”已更改为“structualTypes”。
    • “structuralTypeMap”过去是一个键为EntityTypeName、值为Entity定义的对象。现在看来,“structuralTypes”是一个具有实体定义的数组。

    还建议如果元数据不包含任何structuralTypes,可能会引发异常?目前它正在无声地失败,这对调试没有太大帮助。

    1 回复  |  直到 12 年前
        1
  •  1
  •   Community Mohan Dere    6 年前

    我担心他们在学习游泳之前,你已经跳进了游泳池的最深处。我钦佩你的勇敢,但我对你挣扎着保持漂浮并不感到惊讶。你没有遵循我们为你制定的任何一条简单的道路。我认为这是因为这些路径都不适合您的情况。

    从好的方面来看,您已经意识到,我们很快就必须让从自定义REST服务获取数据的开发人员更加容易。

    问题#1

    查询结果未标识 EntityType 你没有提到你写了一个风俗 JsonResultsAdapter 以应对这种情况。你的问题和你的 MetadataStore 下面的内容表明您正在使用开箱即用的Web API适配器,它不知道如何处理JSON查询结果。

    以下是查询中JSON有效载荷中的一项,为便于阅读而重新格式化

    {
      "@id": 1,
      "id": 1,
      "name": "dsad",
      "deploymentStrategies": null,
      "versions": null,
      "groups": null
    }
    

    里面没有任何东西表明 实体类型 此数据属于。我不知道这是什么类型。Breeze也不知道。

    您需要了解 "JsonResultsAdapter" 这就是Breeze如何解释来自服务器的JSON数据并将其映射到 EntityTypes .

    这个 Ruby Sample 有一个习惯 JsonResultsAdapter 这取决于服务器对其返回的每个对象的类型是明确的这一事实;查看每个Rails视图如何添加 $type 节点(例如 sessions:index view ). 如果您可以控制服务器向客户端发送的内容,则可以采用这种方法。

    这个 Edmunds Sample 有一个习惯 JsonResultsAdapter 它必须通过检查JSON数据的特征来推断类型。这是一种法医练习,如果你必须这样做,你只想放纵一下。

    问题#2

    这个 元数据存储 序列化的所有类型信息都为空。此处为易读性重新格式化

    {
      "namingConvention": {
        "name": "camelCase"
      },
      "localQueryComparisonOptions": {
        "name": "caseInsensitiveSQL",
        "isCaseSensitive": false,
        "usesSql92CompliantStringComparison": true
      },
      "dataServices": [
        {
          "serviceName": "http:\/\/www.dockyard.com:8080\/rest\/",
          "hasServerMetadata": true,
          "jsonResultsAdapter": "webApi_default",
          "useJsonp": false
        }
      ],
      "_resourceEntityTypeMap": {
        "platform": "Platform:#com.psidox.dockyard.controller.model.dockyard",
        "application": "Application:#com.psidox.dockyard.controller.model.application",
        ... a bunch more ...
      },
      "_structuralTypeMap": {
        
      },
      "_shortNameMap": {
        
      },
      ... more emptiness ...
        
      }
    }
    

    我发现了第三个问题,并不感到惊讶。

    问题#3

    您的原始元数据与Breeze理解的格式不匹配。看起来你是用手工拼凑的。它看起来不像我认识的任何东西。它与实体框架中的CSDL格式不匹配。它与导出时看到的“Breeze元数据格式”不匹配 元数据存储 .

    它几乎立刻陷入困境。以下是如何开始定义第一种类型:

    "structuralTypeMap": {
       "Group:#com.psidox.dockyard.controller.model.application": {
           "shortName": "Group",
           "namespace": "com.psidox.dockyard.controller.model.application",
    

    以下是应该如何开始的:

    "structuralTypes": [
    {
      "shortName": "Group",
      "namespace": "com.psidox.dockyard.controller.model.application",
    

    我接受你的观点 Breeze Metadata Schema Documentation 不正确。我们应该解决这个问题。

    我赞同你的论点,认为Breeze应该抛出一个例外。我明白它为什么不扔。它只是忽略了它不理解的所有节点。很多解析器都这样做,但这并不是一个充分的借口。

    在本例中,它忽略了“structuralTypeMap”节点以及它必须说明的关于类型的所有内容。当解析器完成时,它对类型一无所知。Breeze不知道你会指定多少类型,但如果没有,它可能会表现出可疑。

    我承认,我个人从未想过使用这种元数据模式描述作为指导。这将是写元数据最困难的方法。

    我建议您查看文档主题 "Metadata by hand" .

    总计

    1. 请先检查一个简单的示例。也许是埃德蒙兹。也许是鲁比。

    2. 学习手写元数据;这并不难。

    3. 了解 JsonResults适配器

    我们确实希望很快为拥有“普通”REST数据服务的开发人员提供具体的指导。

    推荐文章