TL;DR
Это моя попытка решить проблему, поднятую на GitHub. Я обнаружил, что это проблема несовместимости NodeJS. Понижение версии NodeJS до 12.x устраняет эту ошибку.
Если вы работаете с Mongoose версии 6.3.2 и у вас была обновлена версия NodeJS до >14.x или =17.5.0 (это последняя версия на момент написания этого сообщения), вы могли столкнуться с этой ошибкой:
TypeError: Cannot assign to read only property 'map' of object '#<QueryCursor>'
at Object.<anonymous> (/Users/balonsom/Documents/repos/dungeon-master/node_modules/mongoose/lib/cursor/QueryCursor.js:144:27)
at Module._compile (node:internal/modules/cjs/loader:1097:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1151:10)
at Module.load (node:internal/modules/cjs/loader:975:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Module.require (node:internal/modules/cjs/loader:999:19)
at require (node:internal/modules/cjs/helpers:102:18)
at Object.<anonymous> (/Users/balonsom/Documents/repos/dungeon-master/node_modules/mongoose/lib/query.js:12:21)
at Module._compile (node:internal/modules/cjs/loader:1097:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1151:10)
Приведенная выше ошибка вызвана проблемой несовместимости между Mongoose и NodeJS версии 17.5. На репозитории Mongoose GitHub, где была поднята проблема #11377, было предложено несколько предложений, которые я попробовал, но ни одно из них не решило проблему. Кроме того, проблема #11377 была отмечена как решенная проблемой #11381, что для меня было не так.
Как решить ошибку QueryCursor.js Mongoose
Зная, что это проблема совместимости между NodeJS и Mongoose, лучшим решением будет понизить версию моего Node.js до чего-то более раннего, чем версия 14 🤔.
Но подождите, у меня есть другие проекты на моей локальной машине, которые я запускаю и которые несовместимы с Node.js версии <16.x 😟.
Именно здесь в игру вступает NVM – (Node Version Manager). NVM позволяет нам устанавливать и запускать несколько версий NodeJS на нашей локальной машине. Для получения подробного руководства по установке и использованию NVM, пожалуйста, обратитесь к этому руководству от Digital Ocean.
Установка и использование NVM
В этом руководстве я расскажу вам о том, как установить NVM и использовать Node.js v12 для вашего проекта Mongoose.
Как установить NVM
Чтобы установить NVM, выполните следующие команды
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
или используя wget
.
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
После установки закройте терминальное приложение, чтобы изменения вступили в силу. Вам также потребуется добавить пару строк в файл запуска оболочки bash. Этот файл может иметь имя .bashrc
, .bash_profile
или .zshrc
в зависимости от вашей операционной системы. Для этого снова откройте приложение терминала и выполните следующие команды:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"
Установка NodeJS v12.x
Чтобы установить NodeJS 12, вставьте в терминал следующую команду
nvm install 12
После выполнения этой команды в вашем терминале появится следующее сообщение:
Output
Downloading and installing node v12.22.12...
Downloading https://nodejs.org/dist/v12.22.12/node-v12.22.12-darwin-x64.tar.xz...
######################################################################### 100.0%
Computing checksum with shasum -a 256
Checksums matched!
Now using node v12.22.12 (npm v6.14.16)
Вы успешно установили NodeJS v12 на свою локальную машину. Это означает, что теперь вы используете несколько версий NodeJS.
Список установленных версий Node.js на вашей машине
Имея несколько различных версий Node.js, мы можем запустить nvm
с аргументом ls
, чтобы перечислить все установленные версии:
nvm ls
Вывод, полученный при выполнении этой команды, может выглядеть примерно так:
v12.22.12
v14.19.2
v17.5.0
system
default -> node (-> v17.5.0)
iojs -> N/A (default)
unstable -> N/A (default)
node -> stable (-> v17.5.0) (default)
stable -> 17.5 (-> v17.5.0) (default)
lts/* -> lts/gallium (-> N/A)
lts/argon -> v4.9.1 (-> N/A)
lts/boron -> v6.17.1 (-> N/A)
lts/carbon -> v8.17.0 (-> N/A)
lts/dubnium -> v10.24.1 (-> N/A)
lts/erbium -> v12.22.12
lts/fermium -> v14.19.2
lts/gallium -> v16.15.0 (-> N/A)
Ваш результат будет отличаться от моего в зависимости от того, сколько версий Node.js установлено на вашей машине.
На следующем этапе нам нужно указать, какую версию NodeJS мы хотим использовать в нашей программе или проекте. Для этого выполните следующие шаги:
Использование NodeJS v12 в нашем проекте
cd
в директорию вашего проекта, выполнив эту команду
cd <path/to/your/project/directory>
Затем выполните эту команду ниже, чтобы указать версию NodeJS, которую вы хотите использовать, в нашем случае v12
nvm use 12
Вы получите следующий результат
Now using node v12.22.12 (npm v6.14.16)
Поздравляем 🎆🎇🎊🎈
Теперь вы используете версию NodeJS для этого конкретного проекта, сохраняя при этом активную версию Node.js по умолчанию на вашей машине.
Дополнительное чтение
- Как запустить несколько версий Node.js с помощью Node Version Manager
- Как установить несколько версий node js на одной машине
Следуйте за мной
- В Twitter @eunit99
- На GitHub @eunit99