我试图在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>
为什么这不起作用?
提前感谢!
答案 0 :(得分:2)
您需要保存正则表达式源代码:
var regex = new RegExp('test');
Session.set('regex', regex.source);
...
var restoredRegex = new RegExp(Session.get('regex'));
console.log(restoredRegex);
答案 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中!
希望这可以帮助宇宙中的某个人。 :)