繁体   English   中英

流星会话变量不存储数组

[英]Meteor Session variable not storing array

我正在处理一个带有搜索选项过滤器的项目,它们是通过会话更新的,但是我在会话变量实际上采用数组时遇到了一些问题。 它适用于基于非数组的值,但例如,当我传递一个包含 RegExp 对象的数组以在 mongo $in 选择器中使用时,它无法按预期工作。 这些函数一直工作正常,直到它在下面的代码片段中遇到 Session.set() 所以我知道我必须做错了什么:

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],并且该数组中的对象为空 我已经阅读了有关 Session 变量和数组的其他溢出帖子,并且在传递数组之前简单地克隆它似乎不起作用。 知道我做错了什么吗?

你的代码是正确的(虽然有点复杂)。 问题是 Session 只接受 EJSON-able 值,而正则表达式不接受 EJSON-able。 从 EJSON 的角度来看,regex 看起来就像一个空对象,而这正是你在存储数组中得到的。 如果您尝试使用自定义原型或私有(不可枚举)属性存储对象,则会出现类似的问题:未序列化为 EJSON 的所有内容都将丢失。

此处的解决方案是创建您自己的可与正则表达式一起使用的序列化方法。 例如,如果你总是有一个正则表达式的平面数组,你可以在存储之前简单地将它们字符串化:

var temp = _.map(this.value, function(regex) {
  return regex.toString();
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM