Ошибка эталона метеора

0

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

Ошибка:

W202306-18:14:53.145(-4)? (STDERR) /Users/Ed/appTest/.meteor/local/build/programs/server/boot.js:184
W202306-18:14:53.146(-4)? (STDERR) }).run();
W202306-18:14:53.146(-4)? (STDERR)    ^
W202306-18:14:53.147(-4)? (STDERR) ReferenceError: require is not defined
W202306-18:14:53.148(-4)? (STDERR)     at app/node_modules/stripe/test/charges.js:1:47
W202306-18:14:53.148(-4)? (STDERR)     at app/node_modules/stripe/test/charges.js:65:3
W202306-18:14:53.149(-4)? (STDERR)     at mains (/Users/Ed/appTest/.meteor/local/build/programs/server/boot.js:153:10)
W202306-18:14:53.149(-4)? (STDERR)     at Array.forEach (native)
W202306-18:14:53.149(-4)? (STDERR)     at Function._.each._.forEach (/Users/Ed/.meteor/tools/3cba50c44a/lib/node_modules/underscore/underscore.js:79:11)
W202306-18:14:53.150(-4)? (STDERR)     at /Users/Ed/appTest/.meteor/local/build/programs/server/boot.js:80:5
=> Exited with code: 1
=> Your application is crashing. Waiting for file change.
Теги:
meteor

2 ответа

1
Лучший ответ

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

1.) Структура приложения: по умолчанию для каждого файла в вашем проекте метеор будет пытаться загрузить его как на стороне клиента, так и на стороне сервера. Если вы хотите разделить файлы для клиента и сервера, вам необходимо использовать их для размещения в папках клиента и сервера. Существуют и другие ключевые имена папок, которые метеор смотрит на такие пакеты, как lib, и т.д. Это объясняется в разделе "Структурирование вашего приложения" метеорных документов: http://docs.meteor.com

Проблемы у вас в том, что ваш плагин jQuery и модуль Stripe находятся в корне вашего проекта, поэтому, когда код на стороне сервера выглядит в jQuery, он не знает, что делать, и когда клиент просматривает весь ваш код модуля Stripe, который написан как узел.js, он не знает, как с ним справиться.

Теперь у вас есть папка "Клиент", но, как я только что узнал, глядя на вашу проблему, метеор очень разборчивый, и поэтому он требует, чтобы все было нестандартным. Поэтому прежде всего переименуйте папку клиента клиенту. Затем переместите папку jquery-jplayer внутри папки клиента. Наконец, я бы предложил создать папку с сервером и переместить туда модуль узла, но вместо этого я предлагаю лучший способ...

2.) Использование пакетов с метеоритом. С помощью стандартного приложения node.js вы просто сделаете "npm install module-name". В метеорных пакетах, как правило, обрабатываются по-разному. Прежде всего, вместо того, чтобы делать npm install, вы можете запросить серверную часть пакета, выполнив Npm.require('module-name'); Во-вторых, пакеты имеют стандартный способ создания, который объясняется в "Написание пакетов" метеорных документов. Я сохраню вам все детали и объясню, как заставить Stripe работать в вашем приложении.

К счастью, кто-то еще создал пакет Stripe для Meteor. Помимо стандартных пакетов в комплекте с метеорной базой, учетными записями и т.д., Существует хранилище пакетов, сделанных членами сообщества. Чтобы установить эти пакеты, вам необходимо установить инструмент командной строки, называемый метеоритом. Подробности для этого описаны здесь: https://atmosphere.meteor.com/wtf/app. Затем, чтобы установить пакет Stripe, созданный Tyler Johnson (https://atmosphere.meteor.com/package/stripe), просто сделайте "mrt add stripe" из корневого каталога проекта. Затем удалите папку node_modules, которую вы сейчас используете. Отныне для запуска вашего приложения meteor типа "mrt" в командной строке вместо "meteor" это требуется, потому что теперь вы используете пакеты метеоритов в этом приложении, для будущих приложений, которые не используют пакеты метеоритов, которые вы можете продолжить просто используя 'метеор'

Другие незначительные ошибки:

  • в строке 11 myMusicApp.html вы ссылаетесь на имя шаблона {{> Playlist}} вместо списков воспроизведения
  • в строке 32 myMusicApp.js вы вызываете jPlayer по $ ("# jquery_jplayer_1"). jplayer ({... но вы должны использовать капитал P ie $ ("# jquery_jplayer_1"). jPlayer (вы узнаете в программировании этот материал очень специфичен, когда речь идет о заглавных буквах или отсутствии)
  • последние ошибки происходят из ваших событий в myMusicApp.js, в частности, в файле okCancelEvents. Я не уверен, что вы пытаетесь сделать в этом бите, события mousedown, click и dblclick над ним выглядят нормально.
  • 0
    Это не относится к ReferenceError
-1

ReferenceError - ошибка узла. Метеор - это каркас на вершине Узла.

Узел имеет глобальный масштаб (он же global переменная узла). Эта ошибка вызывается Node (not Meteor), если вы пытаетесь получить доступ к неопределенной глобальной переменной.

Браузеры также имеют глобальную область, называемую window, и не бросают ReferenceErrors при доступе к неопределенным переменным.

Вот шаблон, который мне нравится для добавления функциональности в класс (это очень Метеор):

/lib/Helpers.js      <-- Helpers for everyone (node+browser)
/server/Helpers.js   <-- Server helpers (node)
/client/Helpers.js   <-- Client helpers (browser)

Рассмотрим эти реализации:

// /lib/Helpers.js
Helpers = {/* functions */};  // Assigned to window.Helpers and global.Helpers

// /server/Helpers.js
Helpers = _.extend(Helpers, {/*more functions*/}

// /client/Helpers.js
Helpers = _.extend(Helpers, {/*more functions*/}

Это тривиальный пример. Что, если я не хочу беспокоиться о порядке загрузки? Почему не _.extend() в /lib/Helpers.js?

// /lib/Helpers.js
// Helpers = {/* functions */};                  // Overwrites...
Helpers = _.extend(Helpers, {/* functions */});  // ReferenceError

Потому что вы получите ReferenceError из узла, если Helpers не определены - в частности, "Помощники", используемые в качестве аргумента. (Узел знает, как назначить помощников как global.Helpers).

Вот два способа "исправить":

1) Назначить помощников чему-то

// /lib/Helpers.js
// Helpers = Helpers || {};   // Also a ReferenceError
if (typeof Helpers === 'undefined') Helpers = {};
Helpers = _.extend(Helpers, {/* functions */});

2) Использовать помощников из глобального

// /lib/Helpers.js
Helpers = _.extend(global.Helpers, {/* functions */});  // works in node, but...

Оба из них сосут.

1) синтаксис ужасен. Но хорошо для первых заявлений, я думаю. 2) работает в узле, но глобальных браузеров нет. Таким образом, это не соответствует цели.

Если у вас есть удобный кросс-платформенный синтаксис для этого, сделайте комментарий :-)

  • 0
    Пожалуйста, не публикуйте одинаковые ответы. Отметьте вопросы как дубликаты, если необходимо, или адаптируйте свой ответ на отдельный вопрос.
  • 0
    @miken - Отлично! Вы похоронили правильный ответ на вопрос, который появляется в качестве лучшего результата поиска! Кому ты помогаешь? Теперь я помню, почему я не трачу время, отвечая на вопросы здесь.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню