如何修改正在运行的Meteor(陨石)?

时间:2013-08-26 16:46:37

标签: open-source meteor meteorite

开源项目的一个好处是,您可以打开代码,查看代码,甚至修改代码以帮助您了解内幕

如何修改meteor(ite)的基本代码,以便我可以插入自己的控制台日志语句来查看代码的工作方式?我将我的应用程序作为陨石应用程序(mrt

运行

我尝试但没有工作的事情:  *编辑我的.meteor源代码树  *编辑我的.meteorite源代码树  *编辑/myApp/.meteor/local/build

其他细节: 我的具体用例(尽管答案应该比回答这个更常见)是我收到错误“排队任务中的​​异常:错误:Meteor当前不支持ObjectID以外的对象作为ids”并想要console.log id是什么(即,如果它不是ObjectID,那么它是什么?)

以下是完整错误:

I20130826-10:36:36.038(-6)? Exception in queued task: Error: Meteor does not currently support objects other than ObjectID as ids
I20130826-10:36:36.039(-6)?     at Function.LocalCollection._idStringify (packages/minimongo/minimongo.js:845)  
I20130826-10:36:36.039(-6)?     at _.extend._nextObject (packages/mongo-livedata/mongo_driver.js:549) 
I20130826-10:36:36.039(-6)?     at _.extend.forEach (packages/mongo-livedata/mongo_driver.js:570)  
I20130826-10:36:36.039(-6)?     at _.extend.getRawObjects (packages/mongo-livedata/mongo_driver.js:621) 
I20130826-10:36:36.039(-6)?     at _.extend._pollMongo (packages/mongo-livedata/mongo_driver.js:897)  
I20130826-10:36:36.040(-6)?     at Object._.extend._unthrottledEnsurePollIsScheduled [as task] (packages/mongo-livedata/mongo_driver.js:841)  
I20130826-10:36:36.040(-6)?     at _.extend._run (packages/meteor/fiber_helpers.js:144)  
I20130826-10:36:36.040(-6)?    at _.extend._scheduleRun (packages/meteor/fiber_helpers.js:122)

错误消息位于myApp /目录中的以下文件中:

  • .//。流星/本地/建造/方案/客户/包/ minimongo.js
  • .//。流星/本地/建造/方案/客户/包/ minimongo.js.map
  • .//。流星/本地/建造/方案/ CTL /包/ minimongo.js
  • .//。流星/本地/建造/方案/ CTL /包/ minimongo.js.map
  • .//。流星/本地/编译/程序/服务器/包/ minimongo.js
  • .//。流星/本地/编译/程序/服务器/包/ minimongo.js.map

和〜/ .meteor

  • .//包/ minimongo / 2c0b2ba53f /浏览器/包/ minimongo.js
  • .//包/ minimongo / 2c0b2ba53f /浏览器/包/ minimongo.js.map
  • .//包/ minimongo / 2c0b2ba53f / OS /包/ minimongo.js
  • .//包/ minimongo / 2c0b2ba53f / OS /包/ minimongo.js.map
  • .//包/ minimongo / 80c0a81364a8a504110b56f3e9a2cba2d4e731ee / minimongo.js

2 个答案:

答案 0 :(得分:3)

看起来你在这里问了几件事,所以让我把它分解成不同的答案:

修改流星

这取决于你想要怎么做。如果您在https://github.com/meteor/meteor/tree/devel/packages处取出其中一个包并将其放入/packages文件夹并运行

meteor add packagename

其中 packagename 是包的名称。该软件包将覆盖meteor,让您将其与代码修改一起使用。

如果您想改变流星本身以使其影响所有其他项目,您需要在~/.meteor下查找最新版本。

如果您修改项目的.meteor目录中的文件,~/.meteor中的文件将覆盖它们,您将看不到更改。

我建议使用第一种风格可能会更好,因为它不会干扰你的其他流星项目。

修改陨石

对于Meteorite,您可以使用npm link来使用meteorite project on github的git克隆。这将允许您将其用作npm模块,然后让您修改代码以查看其工作原理。

错误

Meteor允许您使用两种类型的_id,一种来自Meteor.Collection.ObjectID的ObjectID或一个字符串(只要它是唯一的,通常看起来像Random.id()给出的那样。< / p>

如果您遵循跟踪,看起来您正在尝试使用_id既不是ObjectID也不是字符串的集合。如果你以某种方式在流星之外制作你的集合,可能会发生这种情况。要通过该错误,请在meteor之外修改您的集合,并使用_id s,它们是字符串或ObjectIDs

答案 1 :(得分:1)

回答与我收到的错误消息相关的细节,@ Akshat的答案对于通用“修改Meteor”是正确的。

我的错误:

I20130826-10:36:36.038(-6)? Exception in queued task: Error: Meteor does not currently support objects other than ObjectID as ids
I20130826-10:36:36.039(-6)?     at Function.LocalCollection._idStringify (packages/minimongo/minimongo.js:845)  
I20130826-10:36:36.039(-6)?     at _.extend._nextObject (packages/mongo-livedata/mongo_driver.js:549) 
I20130826-10:36:36.039(-6)?     at _.extend.forEach (packages/mongo-livedata/mongo_driver.js:570)  
I20130826-10:36:36.039(-6)?     at _.extend.getRawObjects (packages/mongo-livedata/mongo_driver.js:621) 
I20130826-10:36:36.039(-6)?     at _.extend._pollMongo (packages/mongo-livedata/mongo_driver.js:897)  
I20130826-10:36:36.040(-6)?     at Object._.extend._unthrottledEnsurePollIsScheduled [as task] (packages/mongo-livedata/mongo_driver.js:841)  
I20130826-10:36:36.040(-6)?     at _.extend._run (packages/meteor/fiber_helpers.js:144)  
I20130826-10:36:36.040(-6)?    at _.extend._scheduleRun (packages/meteor/fiber_helpers.js:122)

Minimongo检查对象以尝试使用以下代码确定如何对它们进行字符串化,请参阅对_looksLikeObjectID(id)的调用:

<强>对myApp /包/ minimongo / minimongo.js

LocalCollection._idStringify = function (id) {
  if (id instanceof LocalCollection._ObjectID) {
    return id.valueOf();
  } else if (typeof id === 'string') {
    if (id === "") {
      return id;
    } else if (id.substr(0, 1) === "-" || // escape previously dashed strings
               id.substr(0, 1) === "~" || // escape escaped numbers, true, false
               LocalCollection._looksLikeObjectID(id) || // escape object-id-form strings
               id.substr(0, 1) === '{') { // escape object-form strings, for maybe implementing later
      return "-" + id;
    } else {
      return id; // other strings go through unchanged.
    }
  } else if (id === undefined) {
    return '-';
  } else if (typeof id === 'object' && id !== null) {
    throw new Error("Meteor does not currently support objects other than ObjectID as ids");
  } else { // Numbers, true, false, null
    return "~" + JSON.stringify(id);
  }
};

<强>对myApp /包/ minimongo / objectid.js

LocalCollection._looksLikeObjectID = function (str) {
  return str.length === 24 && str.match(/^[0-9a-f]*$/);
};

这个物体确实是在流星之外建造的(正如@Akshat所怀疑的那样),因为我正在用API保护一个物体。该对象有一个名为“length”的值,它确实是&lt; 24。这导致它脱离了“字符串”式的解释并进入了 } else if (typeof id === 'object' && id !== null) { throw new Error("Meteor does not currently support objects other than ObjectID as ids"); }部分。

将使_looksLikeObjectID检查混乱的示例对象如下:

var aCube = {
    width: 10,
    height: 10,
    length: 10, // <--- messes things up because .length < 24
    _id: ObjectId("521d23ad1d01960000000001")
}

所以,如果你得到这个错误,请检查对象是否有.length字段。解决方法是将“长度”字段嵌套在其他内容中:

var aCube = {
    data: { 
        length:10
    }
};