Breeze fetchEntityByKey不向服务器发出任何请求

Breeze fetchEntityByKey不向服务器发出任何请求,breeze,Breeze,我正在尝试使用Angularjs创建一个文件管理器,我最近发现了Breezejs,并对尝试使用它与后端通信和管理模型关系感兴趣。后端是一个RESTAPI,我可以完全控制它 然而,我遇到了一个问题。我知道文件的id,所以我想请求使用backend\u url/files/:fileId格式的url,其中:fileId是base64编码的文件的url。根据文档,我应该为此使用EntityManager.fetchEntityByKey()。这是我用来创建Angularjs服务的函数: var Fil

我正在尝试使用Angularjs创建一个文件管理器,我最近发现了Breezejs,并对尝试使用它与后端通信和管理模型关系感兴趣。后端是一个RESTAPI,我可以完全控制它

然而,我遇到了一个问题。我知道文件的id,所以我想请求使用
backend\u url/files/:fileId
格式的url,其中
:fileId
是base64编码的文件的url。根据文档,我应该为此使用
EntityManager.fetchEntityByKey()
。这是我用来创建Angularjs服务的函数:

var FilestoreService = function () {

    var dataService, manager;

    dataService = new breeze.DataService({
        serviceName: "../VFS-Symfony-Backend/web/app_dev.php/filesystems/local/",

        hasServerMetadata: false
    });         

    manager = new breeze.EntityManager({
        dataService: dataService
    });

    manager.metadataStore.addEntityType(fileEntityType);

    return {
        findOneById: function (id) {
            /* I have tried to leave the 3th argument empty or changing it to false with the same results */
            return manager.fetchEntityByKey("File", id, true).then(function(){console.log("success");}).fail(function(){console.log("failure");});

            /* I have also tried the following approach with the same result:
            var type, key, query;

            type = manager.metadataStore.getEntityType("File");
            key = new breeze.EntityKey(type, id);
            query = breeze.EntityQuery.fromEntityKey(key);

            return manager.executeQuery(query); 
             */
        }
    };
};
其中
fileEntityType
定义为:

var FileEntityType = new breeze.EntityType({
    shortName: "File"
});

FileEntityType.addProperty(new breeze.DataProperty({
    name: "uri",
    dataType: breeze.DataType.String,
    isNullable: false
}));
FileEntityType.addProperty(new breeze.DataProperty({
    name: "mTime",
    dataType: breeze.DataType.Int16,
    isNullable: false
}));
FileEntityType.addProperty(new breeze.DataProperty({
    name: "type",
    dataType: breeze.DataType.String,
    isNullable: false
}));
 FileEntityType.addProperty(new breeze.DataProperty({
    name: "size",
    dataType: breeze.DataType.int16,
    isNullable: true
}));
但是,当我调用
findOneById
时,不会向服务器发出任何请求,控制台会记录两行代码:

  • 应为空:[]
    由q.js编写

  • fail
    (根据
    fail()
    回调函数)

“正常”查询(
manager.executeQuery(new breeze.EntityQuery().from(“文件”);
)确实会按预期向服务器发出请求

我在这里真的很迷路。我整个周末都在寻找解决方案,最后决定发帖子,希望有人能帮助我


非常感谢阅读。

至少有一个问题是,您没有在元数据中标识“文件”实体类型的描述中的键('id')。您已经定义了除“id”属性之外的所有其他属性

您知道这一点,但让我告诉这个问题的其他读者,他们可能不理解您是在JS客户机上定义元数据,而不是从服务器检索元数据

我也很好奇为什么要使用int16?那真的是正确的类型吗?你真的需要删掉这两个字节吗

最后,Breeze的
fetchEntityByKey
不会以“backend\u URL/files/:fileId的形式发出请求URL。相反,请求URL将是“backend_URL/files/?id=:fileId”,适合OData查询。请参阅DocCode示例的queryTests.cs中有关Id查询的网络流量

如果服务器需要您指定的URL,您仍然可以获取该文件。您将不会使用Breeze查询语法。您只需点击服务所需的URL即可,例如

function findOne(id) { // check cache first var file = manager.getEntityByKey('File', id); if (file) { console.log("got it from cache"); return Q(file); // got it; return in resolved promise } // not in cache; get from server return breeze.EntityQuery .from('Files/'+id) // constructs the URL you want .using(manager).execute() .then(function(data){ console.log("success");} // return the file in a resolved promise return data.results[0] || null; }) .fail(function(error){ console.log("failure: "+ error.message); }); } 函数findOne(id){ //首先检查缓存 var file=manager.getEntityByKey('file',id); 如果(文件){ log(“从缓存中获取”); return Q(file);//得到了;返回 } //不在缓存中;从服务器获取 return.EntityQuery .from('Files/'+id)//构造所需的URL .using(manager.execute()) .then(功能(数据){ console.log(“成功”);} //以已解决的承诺返回文件 返回数据。结果[0]| |空; }) .失败(功能(错误){ console.log(“失败:+错误消息”); }); } 这是DocCode示例中queryTest.cs中的
getByIdCacheOrRemote
方法的变体

是的,更长。您正在重新实现
fetchEntityByKey
,以便可以按预期方式访问远程服务

该方法首先在缓存中查找文件。
getEntityByKey
是缓存的同步搜索。
findOne
方法具有异步语法。。。返回一个承诺。。。因为它可能必须转到服务器。因此,如果我们在缓存中找到文件(同步),我们会将结果封装在一个解析的Q.js承诺中,以使调用者受益,因为调用者希望
findOne
是异步的

如果在缓存中找不到该文件,您将使用一个“查询”转到服务器,该“查询”实际上只是对您选择的URL的一个请求


我很久没试过这个了。我相信你会告诉我它是否有效。。。或者没有。如果没有,它应该这样做,我们会解决它。

至少有一个问题是您没有在元数据中标识“文件”实体类型的描述中的键('id')。您已经定义了除“id”属性之外的所有其他属性

您知道这一点,但让我告诉这个问题的其他读者,他们可能不理解您是在JS客户机上定义元数据,而不是从服务器检索元数据

我也很好奇为什么要使用int16?那真的是正确的类型吗?你真的需要删掉这两个字节吗

最后,Breeze的
fetchEntityByKey
不会以“backend\u URL/files/:fileId的形式发出请求URL。相反,请求URL将是“backend_URL/files/?id=:fileId”,适合OData查询。请参阅DocCode示例的queryTests.cs中有关Id查询的网络流量

如果服务器需要您指定的URL,您仍然可以获取该文件。您将不会使用Breeze查询语法。您只需点击服务所需的URL即可,例如

function findOne(id) { // check cache first var file = manager.getEntityByKey('File', id); if (file) { console.log("got it from cache"); return Q(file); // got it; return in resolved promise } // not in cache; get from server return breeze.EntityQuery .from('Files/'+id) // constructs the URL you want .using(manager).execute() .then(function(data){ console.log("success");} // return the file in a resolved promise return data.results[0] || null; }) .fail(function(error){ console.log("failure: "+ error.message); }); } 函数findOne(id){ //首先检查缓存 var file=manager.getEntityByKey('file',id); 如果(文件){ log(“从缓存中获取”); return Q(file);//得到了;返回 } //不在缓存中;从服务器获取 return.EntityQuery .from('Files/'+id)//构造所需的URL .using(manager.execute()) .then(功能(数据){ console.log(“成功”);} //以已解决的承诺返回文件 返回数据。结果[0]| |空; }) .失败(功能(错误){ console.log(“失败:+错误消息”); }); } 这是DocCode示例中queryTest.cs中的
getByIdCacheOrRemote
方法的变体

是的,更长。您正在重新实现
fetchEntityByKey
,以便按预期方式访问远程服务