Angularjs 无法将复杂的javascript对象转换为查询字符串

Angularjs 无法将复杂的javascript对象转换为查询字符串,angularjs,express,mongoose,query-string,Angularjs,Express,Mongoose,Query String,下面是我试图转换为查询字符串的javascript对象 {$and: [{topic: categoryIds} , {$or :[ {'groups 1': {$ne: ''}}, {groups: $scope.myGroups}]}]}; 基本上,我希望匹配一个主题,该主题等于CategoryID,并抓取具有空组数组的文档,或者该组数组具有值并匹配数组$scope.mygroups中的一个 我的问题是,将其转换为易于解析的格式以便将其附加到GET请求中的最佳做法是什么,以及您如何在exp

下面是我试图转换为查询字符串的javascript对象

{$and: [{topic: categoryIds} , {$or :[ {'groups 1': {$ne: ''}}, {groups: $scope.myGroups}]}]};
基本上,我希望匹配一个主题,该主题等于CategoryID,并抓取具有空组数组的文档,或者该组数组具有值并匹配数组$scope.mygroups中的一个


我的问题是,将其转换为易于解析的格式以便将其附加到GET请求中的最佳做法是什么,以及您如何在express server上对其进行解析。

我在生产中使用此代码查询具有MongoDB后端的服务器(使用angular和lodash):

.factory('mongoQuery',function(){
返回{
fromJson:函数(json){
返回JSON.parse(JSON,fromJsonReviver);
},
toJson:函数(对象){
返回JSON.stringify(对象,toJsonReplacer);
}
};
来自JsonReviver的函数(键、值){
var val=价值;
如果(uu.isPlainObject(值)){
如果(uu.isNumber(值$date)){
val=新日期(0);
val.setutcmillesons(值$date*1000);
}else if(u.isString(值$regexp)){
var match=/^\/(.*)\/([gimy]*)$/.exec(value.$regexp);
val=新的RegExp(匹配[1],匹配[2]);
}
}
返回val;
}
函数toJsonReplacer(键,值){
var val=价值;
如果(uu.isPlainObject(值)){
val=\扩展({},value);
for(var k值){
val[k]=toJsonReplacer(k,val[k]);
}
}否则如果(uu.isDate(值)){
val={$date:(新日期(值)).valueOf()/1000};
}else if(uu.isRegExp(值)){
val={$regexp:value.toString()};
}
返回val;
}
})
它包括其他人在评论中提到的许多建议,并支持日期和正则表达式

除此之外,如果您需要发送带有GET请求的查询,只需像其他人提到的那样使用
encodeURIComponent


下面是一个工作示例:

您在这里的想法基本上是重新开发一个API服务器,再加上一些mongodb数据库,并以某种格式查询它

  • 休息是您正在寻找的“最佳实践”。它是一个将一些常见操作封装到http资源的标准
  • 你应该知道,你不需要根据这样的标准重新开发一个生态系统。存在功能齐全的REST API服务器,有些甚至基于express.js。和。这一个提供了一些额外的特性,如
    • 通过ORM和数据库引擎不可知论进行模型抽象
    • 来自数据库模式或模型定义的自动REST操作
    • 通过“扩展REST”(“where”、“limit”、“order”、…)进行高级查询。
    • 像WebSocket一样使用REST实现实时
    • 帮助您查询服务器的客户端库
  • 一些独立的外部库,如或,可以很好地处理REST服务器,并充当后端的前端连接器

  • 现在,如果我必须完全回答您的问题,并且如果您真的想使用您的解决方案,那么我只需将mongo查询添加到http调用上的
    where
    query参数中,如前所述
    encodeURIComponent

    这对您有用吗?你能改变那个物体吗?它的格式可能更好。为什么不简单地使用
    encodeURIComponent(JSON.stringify({$and:[{topic:categoryIds},{…$scope.myGroups}]}]}))
    ?您是否考虑过将其作为简单的JSON发送?这种复杂的东西我不会放在查询字符串中。既然您控制服务器端代码,为什么不发布它并完全避免这个问题呢?