开源项目的一个好处是,您可以打开代码,查看代码,甚至修改代码以帮助您了解内幕。
如何修改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 /目录中的以下文件中:
和〜/ .meteor
答案 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
}
};