Причины замены базы данных после проблем с конструкцией - PullRequest
0 голосов
/ 18 декабря 2018

Я потратил> 10 часов на возможное улучшение базы данных Apsotrophe, и застрял на том, что кажется несвязанной ошибкой.Я экспериментировал с переключением MongoDB с базы данных плоских файлов, такой как NEDB, LokiJS или TingoDB.Они имеют тот же набор команд, что и MongoDB, иногда за исключением пары небольших команд, которые я смог добавить (в приведенном ниже примере с использованием LokiJS нет метода db.collection, поэтому я написал простойэто прекрасно работает).Конечной целью этого является упрощение размещения крошечных проектов Apos, поскольку вам не нужно беспокоиться о поиске службы для размещения экземпляра MongoDB - он будет храниться в локальном файле (хотя будет очень медленным, еслипроект стал слишком большим - LokiJS должен иметь возможность поддерживать базы данных размером до 1 ГБ без проблем с производительностью, теоретически).

Я вижу, как данные записываются в файлы локальной базы данных, поэтому кажется, что этоза работой.Однако приложение не завершает запуск.Ошибка не возникает, и приложение работает непрерывно, но, кажется, никогда не достигает точки, где есть доступный URL.Я потратил много времени на его отладку, и кажется, что любые методы afterConstruct перестают работать, когда я перезаписал метод connectToMongo в apostrophe-db.Почему-то похоже, что обратный вызов во время запуска апострофа не происходит в асинхронном вызове при запуске модулей - но, насколько я могу судить, изменение базы данных не должно влиять на это.

У меня есть ссылка на Glitchэто показывает проблему.Это очень скромно, и единственным изменением по умолчанию является перезапись метода connectToMongo.Вы можете сделать ремикс бесплатно, если хотите отладить сторону node.js или внести изменения.Если я когда-нибудь смогу заставить это работать, я планирую превратить его в пакет NPM, чтобы другие тоже могли его использовать - на данный момент я довольно застрял.

https://glitch.com/edit/#!/apos-flat-test

(Если вы ранее не использовали Glitch, вы можете сделать копию моего текущего кода и отладить его, щелкнув имя проекта в левом верхнем углу и выбрав Remix Project. Вы также можете присоединиться к отладчику Chrome V8 для отладки узлавещи - вы просто нажимаете кнопку «Журналы» в левом верхнем углу, а затем нажимаете кнопку «Отладка» в нижнем всплывающем окне).

Спасибо!

1 Ответ

0 голосов
/ 21 декабря 2018

Многие из этих функций afterConstruct, включая одну apostrophe-caches, вызывают либо db.getCollection, либо collection.ensureIndex.Вот соответствующий код из модуля caches:

https://gist.github.com/boutell/c4a1b4abda4a19572428b11d0a8babc8

Так что ваша реализация должна поддерживать обе эти вещи, с обратными вызовами или без.

Ваша реализация getCollectionпохоже, он должен работать.

Однако метод ensureIndex для LokiJS очень отличается от метода в MongoDB.MongoDB ожидает:

.ensureIndex({ field: 1 }, callback);

В то время как LokiJS ожидает:

.ensureIndex(fieldName, force)

Это совершенно другой метод с другим воздействием.Нельзя ожидать, что он заменит реализацию MongoDB без дополнительных усилий.

Вызов его с помощью объекта и обратного вызова не устанавливает ожидаемый индекс, и, что более важно, никогда не вызывает обратного вызова.Вот почему это не работает.Без вызова обратного вызова Apostrophe не может двигаться дальше с инициализацией.

Таким образом, проблема заключается не в самойConConstruct, а в неполной эмуляции API MongoDB.Апостроф требует полной реализации API, чтобы гарантировать успех.Возможно, вы добьетесь большего успеха с «моно-подобным», который пытается достичь более высокого уровня совместимости, хотя даже CosmosDB на самом деле не подходит (у него, например, нет общепринятого distinct удобного метода).

Спасибо, что дали этому попытку и предоставили сообществу больше данных о другой полусовместимой базе данных Mongo, хотя - возможно, одна из них в конечном итоге будет достаточно полной, или сообщество Apostrophe внесет свой вклад в создание этого.

...