Meteor:将RegExp对象保存到会话

时间:2014-08-28 09:01:52

标签: javascript regex mongodb session meteor

我试图在Meo Session中为MongoDB查询保存正则表达式作为RegExp对象,但在Session.get()之后,RegExp对象只是一个空对象。

JS

if (Meteor.isClient) {
    Meteor.startup(function () {
          var obj = {};
          obj['regexp'] = new RegExp("test");
          console.log("setting regular expression: " + obj['regexp']);
          Session.set("test", obj);
    });

    Template.test.events({
        'click button': function () {
            var regex = Session.get("test");
            console.log("now it is: ");
            console.log(regex['regexp']);
        }
    });
}

if (Meteor.isServer) {
}

HTML

<head>
  <title>meteor-regexp-session-test</title>
</head>

<body>
  {{> test}}
</body>

<template name="test">
  <button>hit the button and look at the console</button>
</template>

为什么这不起作用?

提前感谢!

3 个答案:

答案 0 :(得分:2)

您需要保存正则表达式源代码:

var regex = new RegExp('test');
Session.set('regex', regex.source);

...

var restoredRegex = new RegExp(Session.get('regex'));
console.log(restoredRegex);

请参阅:http://meteorpad.com/pad/KJHJtQPEapPhceXkx

答案 1 :(得分:1)

Session包使用了ReactiveDict

ReactiveDict序列化传递给Sessions.set(key, value)的值:

// https://github.com/meteor/meteor/blob/devel/packages/reactive-dict/reactive-dict.js
// line 3-7:


var stringify = function (value) {
  if (value === undefined)
    return 'undefined';
  return EJSON.stringify(value);
};

Session.get(key)使用EJSON.parse

对其进行反序列化
// https://github.com/meteor/meteor/blob/devel/packages/reactive-dict/reactive-dict.js
// line 8-12:

var parse = function (serialized) {
  if (serialized === undefined || serialized === 'undefined')
    return undefined;
  return EJSON.parse(serialized);
};

这意味着Session不支持RegExp开箱即用。

您的问题的解决方案是创建自定义响应式数据源,它将与Session类似,但不会序列化/反序列化值对象。

看看这里:

答案 2 :(得分:1)

有一种方便的方法可以教EJSON如何序列化/解析这个SO问题中记录的正则表达式(RegExp):

How to extend EJSON to serialize RegEx for Meteor Client-Server interactions?

基本上,我们可以扩展RegExp对象类并使用EJSON.addType来教授客户端和服务器的序列化。这些选项足以成为正则表达式的关键部分,您应该能够将它们存储在任何您想要的完全有效的JSON中!

希望这可以帮助宇宙中的某个人。 :)