2014-08-28 37 views
1

我试图在MongoDB查询的Meteor会话中保存正则表达式作为RegExp对象,但在Session.get()之后,RegExp对象只是一个空对象。流星:将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> 

为什么这是行不通的任何想法?

预先感谢!

回答

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反序列化:Session

// 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); 
}; 

这意味着不支持RegExp开箱。

针对您的问题的解决方案是创建自定义反应数据源,其工作原理与Session类似,但不会对值对象进行序列化/反序列化。

到这里看看:

+0

哇谢谢。不知道会话使用EJSON反序列化。另一个反应性数据源可能是本地Collection(myQuery = new Meteor.Collection(null))。或者我可以使用[$ regex操作符](http://docs.mongodb.org/manual/reference/operator/query/regex/),这样我就可以将查询保存为字符串。我喜欢eventedmind视频 - 可能会解决它。 – kerosene 2014-08-28 09:55:00

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

+0

感谢您的回答,但不是这样做,我会将参数'test'保存到会话中,然后创建一个新的RegExp对象。问题是我正在创建一个可能具有多个键值的查询对象(其中一些值应该是RegExp对象而其他值不是)。另一种可能性是将所有正则表达式值保存在一个会话变量中,并将所有其他值保存到另一个变量中。 – kerosene 2014-08-28 10:23:53

1

有教EJSON在这太问题记录的一种方便的方法如何序列化/解析正则表达式(正则表达式):

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

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

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