0

开源项目的好处之一是您可以打开代码,查看它的作用,甚至修改它以帮助您了解底层

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

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

其他详细信息:我的具体用例(尽管答案应该比仅回答这个问题更笼统)是我收到错误“排队任务中的​​异常:错误:Meteor 目前不支持 ObjectID 作为 id 以外的对象”并且想要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/ 目录中的以下文件中可以找到错误消息:

  • .//.meteor/local/build/programs/client/packages/minimongo.js
  • .//.meteor/local/build/programs/client/packages/minimongo.js.map
  • .//.meteor/local/build/programs/ctl/packages/minimongo.js
  • .//.meteor/local/build/programs/ctl/packages/minimongo.js.map
  • .//.meteor/local/build/programs/server/packages/minimongo.js
  • .//.meteor/local/build/programs/server/packages/minimongo.js.map

并在 ~/.meteor

  • .//packages/minimongo/2c0b2ba53f/browser/packages/minimongo.js
  • .//packages/minimongo/2c0b2ba53f/browser/packages/minimongo.js.map
  • .//packages/minimongo/2c0b2ba53f/os/packages/minimongo.js
  • .//packages/minimongo/2c0b2ba53f/os/packages/minimongo.js.map
  • .//packages/minimongo/80c0a81364a8a504110b56f3e9a2cba2d4e731ee/minimongo.js
4

2 回答 2

3

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

修改流星

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

meteor add packagename

其中packagename是包的名称。这个包将覆盖meteor并让你使用它的代码修改来代替。

如果您想更改流星本身以使其也影响所有其他项目,则需要在~/.meteor.

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

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

修改陨石

对于 Meteorite,您可以使用npm link让您在 github 上使用 meteorite 项目的 git 克隆。这将允许您将其用作 npm 模块,同时允许您修改代码以查看其在后台是如何工作的。

错误

Meteor 允许您使用两种类型的_id,通过Meteor.Collection.ObjectID的 ObjectID或字符串(只要它是唯一的,并且通常看起来像Random.id()给出的东西。

如果您跟踪跟踪,看起来您正在尝试使用_id既不是 ObjectID 也不是字符串的集合。如果您以某种方式在流星之外进行收藏,则可能会发生这种情况。要通过错误,请在流星之外修改您的集合并使用_id作为字符串或 ObjectID 的 s

于 2013-08-26T18:29:49.883 回答
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/packages/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/packages/minimongo/objectid.js

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

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

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

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

因此,如果您遇到此错误,请检查对象是否具有 .length 字段。解决方法是将“长度”字段嵌套在其他内容中:

var aCube = {
    data: { 
        length:10
    }
};
于 2013-08-27T22:44:03.050 回答