Я немного новичок в программировании и надеялся, что кто-то поможет мне разобраться с проблемой моего приложения. Вот ссылка на мой репо в Гитубе.
Ошибка:
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.
существует ряд проблем, связанных главным образом с структурой папок приложения и использованием пакетов в метеор.
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" это требуется, потому что теперь вы используете пакеты метеоритов в этом приложении, для будущих приложений, которые не используют пакеты метеоритов, которые вы можете продолжить просто используя 'метеор'
Другие незначительные ошибки:
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) работает в узле, но глобальных браузеров нет. Таким образом, это не соответствует цели.
Если у вас есть удобный кросс-платформенный синтаксис для этого, сделайте комментарий :-)