Javascript Meteor会话变量未存储数组
我正在处理一个带有搜索选项过滤器的项目,这些过滤器通过会话进行更新,但是会话变量实际占用数组时出现了一些问题。它适用于非基于数组的值,但例如,当我传递一个包含RegExp对象的数组以在mongo$in选择器中使用时,它并没有按预期工作。这些函数一直工作正常,直到它遇到下面代码段中的Session.set(),所以我知道我一定是在做一些错误的事情:Javascript Meteor会话变量未存储数组,javascript,meteor,Javascript,Meteor,我正在处理一个带有搜索选项过滤器的项目,这些过滤器通过会话进行更新,但是会话变量实际占用数组时出现了一些问题。它适用于非基于数组的值,但例如,当我传递一个包含RegExp对象的数组以在mongo$in选择器中使用时,它并没有按预期工作。这些函数一直工作正常,直到它遇到下面代码段中的Session.set(),所以我知道我一定是在做一些错误的事情: Option.prototype.update = function () { //updates session variable if stati
Option.prototype.update = function () {
//updates session variable if static option
if (!this.isDynamic) {
if(Object.prototype.toString.call(this.value) === '[object Array]') {
var temp = this.value.slice(0);
Session.set(this.optionName, temp);
console.log(Session.get(this.optionName));
}
else {
Session.set(this.optionName, this.value);
}
};
};
无论出于何种原因,它都会显示,而不是显示包含值的数组
[Object],且该数组中的对象为空。我已经阅读了关于会话变量和数组的其他溢出帖子,在传递之前简单地克隆数组似乎不起作用知道我做错了什么吗?您的代码是正确的(尽管有点复杂)。问题是会话只接受EJSON-able值,而正则表达式不支持EJSON-able。从EJSON的角度来看,正则表达式看起来就像一个空对象,而这正是存储数组中的结果。如果您尝试使用自定义原型或私有(不可枚举)属性存储对象,则会出现类似的问题:未序列化到EJSON的所有内容都将丢失
这里的解决方案是创建自己的序列化方法来处理正则表达式。例如,如果您总是有一个正则表达式的平面数组,那么您可以在存储之前简单地将其字符串化:
var temp = _.map(this.value, function(regex) {
return regex.toString();
});
您可以展示一个您正在存储的数据的示例吗?[/keyword/gim/]是一个示例,其中对象是一个RegExp,它是从一个option对象中提取的,该对象的结构为
var option=function(optionName,isDynamic,defaultValue){//initialize object here this.defaultValue=defaultValue;this.value=defaultValue;this.isDynamic=isDynamic;this.optionName=optionName;Session.set(this.optionName,this.defaultValue);}
您可能想看看,因为这是代码库中出现的唯一一个问题实例,我不想在不首先探索所有其他选项的情况下添加一个完整的包来解决这个问题,但是谢谢!谢谢@Hubert,这是有意义的。我认为序列化可能是一个解决方法,但我认为可能有JU我的代码中没有错误。再次感谢您的帮助!