2013-08-26 2 views
0

Одним из преимуществ проектов с открытым исходным кодом является то, что вы можете открыть код, посмотреть, что он делает, и даже изменить его, чтобы помочь вам понять под капотом.Как я могу изменить метеорит (метеорит), который работает?

Как изменить базовый код метеор (ite), чтобы я мог вставлять собственные операторы журнала консоли, чтобы посмотреть, как работает код? Я бегу мое приложение как приложение метеорита (mrt)

Вещи, которые я попробовал, но не получил работать: * редактированием .meteor дерево исходников * редактирование моего .meteorite исходного дерева * редактирование в /myApp/.meteor/local/build

Дополнительная информация: Мой конкретный прецедент (хотя ответ должен быть более общим, чем ответ на этот вопрос) заключается в том, что я получаю сообщение об ошибке «Исключение в задаче в очереди: Ошибка: Метеор в настоящее время не поддерживает объекты кроме ObjectID как идентификаторы ", и хотите, чтобы console.log был идентификатором (т. е. если это не идентификатор объекта, то что это такое?)

Вот полная ошибка:

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
  • .// пакеты/minimongo/2c0b2ba53f/браузер/пакеты/minimongo.js.map
  • .//packages/minimongo/2c0b2ba53f/os/packages/minimongo.js
  • .//packages/minimongo/2c0b2ba53f/os/packages/minimongo.js.map
  • .//packages/minimongo/80c0a81364a8a504110b56f3e9a2cba2d4e731ee/ minimongo.js
+0

Оказывается, ошибка хорошо документированной здесь: https://github.com/meteor/meteor/issues/594 и здесь: https://github.com/meteor/meteor/issues/876 –

ответ

3

похоже, вы спрашиваете пару вещей здесь, так что позвольте мне разбить его на разные ответы:

разделе Изменение Метеор

Это зависит от того, как вы хотите сделатьЭто.Если взять один из пакетов более в https://github.com/meteor/meteor/tree/devel/packages и поместить их в папку /packages и запустить

meteor add packagename 

Где имя_пакета это имя пакета. Этот пакет переопределит метеор и позволит вам использовать его с его модификациями кода.

Если вы хотите изменить сам метеорит, чтобы он повлиял на все ваши другие проекты, вам нужно найти последнюю версию под ~/.meteor.

Если вы измените файлы в каталоге .meteor вашего проекта, те из ~/.meteor собираются перезаписать их, и вы не увидите изменений.

Я бы предположил, что лучше использовать первый стиль, поскольку он не будет мешать вашим другим метеорным проектам.

Модифицирование Метеорит

Когда дело доходит до метеорита, вы могли бы использовать npm link, чтобы позволить вам использовать Git клон meteorite project on github. Это позволит вам использовать его в качестве модуля npm и, тем не менее, позволить вам изменить код, чтобы увидеть, как он работает под капотом.

Ошибка

Метеор позволяет использовать два типа _id, ObjectID через Meteor.Collection.ObjectID или строку (до тех пор, как его уникальный, и обычно выглядит примерно так, как Random.id() выдает.

Если вы следите за трассировкой, похоже, вы пытаетесь использовать коллекцию, в которой _id не является ни ObjectID, ни строкой. Это может произойти, если вы каким-то образом внедрили свою коллекцию за пределами метеора. Чтобы пройти эту ошибку, измените свою коллекцию за пределами метеор и использование _id s, которые либо строки или объектные идентификаторы

+0

Я скопировал minimongo в myApp/packages, запустил «meteor add minimongo», наконец, вставил «console.log (« id is », id); к myApp/packages/minimongo/os/packages/minimongo.js между строками 844 и 845 (я не обновлял номера пропущенных строк). Когда я запускаю 'mrt' сейчас, он выдает сообщение« SyntaxError: Неожиданный конец ввода »(см. Этот gist https://gist.github.com/MaerF0x0/6345337) –

+0

Вам нужно проверить свой код на незакрытые скобки или кавычки, по крайней мере, то, откуда может возникнуть неожиданный конец ошибки ввода. Недостаточно в сути, чтобы точно знать, что случилось. Также вам нужно сохранить целостную структуру папок, вы скопировали minimongo.js в '/ packages'. Вам также нужно скопировать весь пакет «minimongo». Hope – Akshat

+0

В моем коде не было ошибки, но в каком файле я редактировал. Я повторил ваши инструкции, и это сработало хорошо. –

1

Ответ на специфику, связанную с сообщением об ошибке, которое я получал, @ Ответ Акшата правилен для общего назначения «модификации Метеор».

Моя ошибка:

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 инспектирует объекты, чтобы попытаться решить, как stringify их с помощью следующего кода см позвонить в _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. Объект имел значение под названием «длина», и это действительно было < 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") 
} 

так что если вы получаете эту ERR, проверьте, чтобы увидеть, если объект имеет .Length поле. работа вокруг гнездиться «длина» поля внутри что-то другое:

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

Оказывается, ошибка хорошо документирована здесь: https://github.com/meteor/meteor/issues/594 и здесь: https://github.com/meteor/ метеор/вопросы/876 –