在Meteor中存储功能的位置和方式?或者如何使用system.js?

时间:2015-06-14 17:40:08

标签: mongodb meteor

我需要一种存储大量不同功能的方法,每种功能都有一个唯一的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()

1 个答案:

答案 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)。