我需要一种存储大量不同功能的方法,每种功能都有一个唯一的ID,也许还有一些其他属性,我可以查询这些属性并将其带回客户端或服务器以供使用。
保存功能的唯一方法是使用MongoDB的system.js
集合,但我无法通过Meteor访问它。
当我尝试在这里实施解决方案时,我似乎可以保存一个功能,但我不知道如何将其恢复并运行它:
How do I access mongos db.system.js in meteor?
// on /server
var myDB = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
systemJS = myDB.collection('system.js');
systemJS.save({
_id: "echoFunction",
value : function(x) { return x; }
},
function (err, inserted) {
console.log("error: ", err);
console.log("number of docs inserted: ", inserted);
}
);
systemJS.save({
_id : "myAddFunction" ,
value : function (x, y){ return x + y; }
},
function (err, inserted) {
console.log("error: ", err);
console.log("number of docs inserted: ", inserted);
}
);
// always causes the server to crash
// systemJS.findOne()
// returns undefined for db
// db.LoadServerScripts()
答案 0 :(得分:2)
好吧,我找到了一种让它起作用的非常丑陋的方式:
我把它放入 /server/fixtures.js
myDB = MongoInternals.defaultRemoteCollectionDriver().mongo.db;
systemJS = myDB.collection('system.js');
systemJS.save({
_id: 'echoFunction',
value : 'function(x) { return x; }'
},
function (err, inserted) {
console.log("error: ", err);
console.log("number of docs inserted: ", inserted);
}
);
systemJS.save({
_id : "myAddFunction" ,
value : 'function (x, y){ return x + y; }'
},
function (err, inserted) {
console.log("error: ", err);
console.log("number of docs inserted: ", inserted);
}
);
var arg = "10, 5";
var mongoFuncName='myAddFunction';
var string = 'db.loadServerScripts(); return ' + mongoFuncName+ '(' + arg + ');';
console.log(string);
myDB.eval(string, function (err, mongoFuncReturnData) {
console.log("error: ", err);
console.log("mongoFuncReturnData: ", mongoFuncReturnData);
});
// counting the number of functions in system.js
myDB.eval("db.system.js.count();", function (err, mongoFuncReturnData) {
console.log("error: ", err);
console.log("mongoFuncReturnData: ", mongoFuncReturnData);
});
// finding and retrieving a stored function via the _id
myDB.eval("db.system.js.findOne({_id: 'myAddFunction'});", function (err, mongoFuncReturnData) {
console.log("error: ", err);
console.log("mongoFuncReturnData: ", mongoFuncReturnData);
});
神圣的地狱是难看的。我非常希望有更好的方法来做到这一点。
我还担心如果我实施这个明显的黑客攻击,当更新到来时它可能会严重危及我的系统更新。
另请注意,函数定义仍然必须是字符串。如果它们不是字符串,则不会保存它们(仅保存_id)。