我正在尝试从JavaScript azure移动服务中读取结果,并且我想返回具有特定值的项目。我正在使用getTable('')。其中。('')。read('')检查返回的json值之一是否与特定模式匹配,如this post所示:
这是我的客户端脚本:
function getSP() {
var spUser = client.getTable("User").where(function (contains) {
return this.extraname.indexOf(contains) > 0;
}, "Eyad").read().done(function (results) {
alert(JSON.stringify(results));
}, function (err) {
alert("Error: " + err);
});}
从客户端生成请求URL:
https://XYZ.azure-mobile.net/tables/User?$filter=(indexof(extraname,'Eyad') gt 0)
但是上面的代码从服务返回一个空的[]对象,而执行相同的操作而没有where()检查清楚地返回我的预期值:
我做错了什么?如何返回返回" extraname"的行。包含子串" Eyad"?
注意:我在服务端也有一个自定义阅读脚本,你可以看到" extraname"为测试目的,值是硬编码的:
function read(query, user, request) {
request.execute({
success: function(results) {
var now = new Date();
results.forEach(function(item) {
console.log(item.userjsondata);
item.extraname = "Eyad";
});
request.respond(); //Writes the response
}
});
}
答案 0 :(得分:1)
如果您正在动态生成新列,则无法直接使用$filter
子句根据该值过滤结果。请注意,您可以编写任意代码来计算该值,因此移动服务运行时无法知道它最终会生成什么值,并且无法基于此执行过滤。
您的解决方案有几种解决方法:如果可能,您可以使用与生成值相同的表达式发送where
子句。在某些情况下,服务也会接受$filter
子句中的表达式。这样做有一个缺点,就是你会在两个不同的地方找到相同的逻辑,并且很有可能你会改变一个并最终忘记改变另一个。
另一种方法是传递要查询生成的属性的参数而不是$filter
参数(即,不要使用where
函数,而是传递read
内的参数{1}}调用。这些参数将传递到read
对象中的request.parameters
脚本,您可以在完成阅读后根据该值添加逻辑进行过滤数据库(见下文)。
<强>客户端:强>
var spUser = client.getTable("User").read({mustContain: "Eyad").done(function (results) {
alert(JSON.stringify(results));
}, function (err) {
alert("Error: " + err);
});}
<强>服务强>
function read(query, user, request) {
var mustContain = request.parameters.mustContain;
request.execute({
success: function(results) {
var now = new Date();
var filteredResults = [];
results.forEach(function(item) {
console.log(item.userjsondata);
item.extraname = "Eyad";
if (item.extraname.indexOf(mustContain) >= 0) {
filteredResults.push(item);
}
});
request.respond(200, filteredResults); //Writes the response
}
});
}
答案 1 :(得分:0)
改变你的比较:
return this.extraname.indexOf(contains) > 0;
到此:
return this.extraname.indexOf(contains) >= 0;
在第一个索引中可以找到匹配的字符串(在您的情况下,总是)。因此,您必须使用大于OR等于运算符来处理该情况。