Meteor会话变量未存储数组

Meteor Session variable not storing array

本文关键字:存储 数组 变量 会话 Meteor      更新时间:2023-09-26

我正在处理一个带有搜索选项过滤器的项目,它们通过会话进行更新,但会话变量实际使用数组时遇到了一些问题。它适用于非基于数组的值,但例如,当我传递一个包含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变量和数组的Overflow文章,在传递数组之前简单地克隆数组似乎不起作用知道我做错了什么吗

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

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

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