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