DEV Community

Cover image for How to Solve QueryCursor.js Mongoose error with NVM
Eunit
Eunit

Posted on

How to Solve QueryCursor.js Mongoose error with NVM

TL;DR

This is my attempt at resolving this issue raised on GitHub. I discovered that it was a NodeJS incompatibility issue. Downgrading your NodeJS version to 12.x resolves this error.

If you are working with Mongoose version 6.3.2 and you had your NodeJS version updated to >14.x or =17.5.0 (this is the latest version as of when I am writing this post), you might have encountered this error:

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)
Enter fullscreen mode Exit fullscreen mode

The above error is caused by an incompatibility issue between Mongoose and NodeJS version 17.5. On the Mongoose GitHub repo where the issue #11377 was raised, several suggestions were offered which I tried all but none resolved the error for me. Also, issue #11377 was marked resolved by issue #11381 which was not the case for me.

How to Solve QueryCursor.js Mongoose error

Knowing that this is a compatibility issue between NodeJS and Mongoose, the best solution will be to downgrade my Node.js version to something earlier than version 14 ๐Ÿค”

But wait, I have other projects on my local machine that I am running which are incompatible with Node.js versions <16.x ๐Ÿ˜Ÿ

This is where NVM - (Node Version Manager) comes into play. NVM allows us to install and run multiple versions of NodeJS on our local machine. For an in-depth guide on how to install and use NVM, please refer to this tutorial by Digital Ocean.

Installing and Using NVM

In this guide, I shall walk you through the essentials of installing NVM and using Node.js v12 for your Mongoose project.

How to Install NVM

To install NVM, run the following commands

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
Enter fullscreen mode Exit fullscreen mode

or using wget

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
Enter fullscreen mode Exit fullscreen mode

Once installed, close your terminal application for changes to take effect. You will also need to add a couple of lines to your bash shell startup file. This file might have the name .bashrc, .bash_profile, or .zshrc depending on your operating system. To do this, reopen your terminal app and run the following commands:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
Enter fullscreen mode Exit fullscreen mode

Installing NodeJS v12.x

To install NodeJS 12, paste the following command into your terminal

nvm install 12
Enter fullscreen mode Exit fullscreen mode

After running this command, this is the output that will display in your terminal app:

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)
Enter fullscreen mode Exit fullscreen mode

You have successfully installed NodeJS v12 on your local machine. This means that you are now running multiple versions of NodeJS.

List installed Node.js versions on your machine

With a handful of different versions of Node.js installed, we can run nvm with the ls argument to list out everything we have installed:

nvm ls
Enter fullscreen mode Exit fullscreen mode

The output produced by running this command might look something like this:

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)
Enter fullscreen mode Exit fullscreen mode

Your output will definitely differ from mine depending on how many versions of Node.js you have installed on your machine.

The next step entails us specifying which version of NodeJS we want to use in our program or project. To do this, follow the below steps:

Using NodeJS v12 in our project

cd into the directory of your project by running this command

cd <path/to/your/project/directory>
Enter fullscreen mode Exit fullscreen mode

Then run this command below to specify the NodeJS version want to use, in our case, v12

nvm use 12
Enter fullscreen mode Exit fullscreen mode

You will get the following output

Now using node v12.22.12 (npm v6.14.16)
Enter fullscreen mode Exit fullscreen mode

Congratulations ๐ŸŽ†๐ŸŽ‡๐ŸŽŠ๐ŸŽˆ

You are now using NodeJS version for this specific project, while also preserving the default active version of Node.js on your machine.

Further reading

  1. How To Run Multiple Versions of Node.js with Node Version Manager
  2. How do I install multiple node js version on the same machine

Follow Me

  1. On Twitter @eunit99
  2. On GitHub @eunit99

Discussion (1)

Collapse
uzlopak profile image
Uzlopak

Your tutorial is missing the point. Downgrading to node 12 is like saying: Hey your Tesla needs Electricity, but to still use gasoline use a Ford Model-T. Despite the fact you could use a modern car, which uses gasoline.

Also our CI/CD Pipelines is testing for node18, which actually would fail if that issue was still existing. But the patch by @benjamingr is solving that issue also for node18.

So to solve that issue, you would need to upgrade mongoose to latest version OR use any version of node 17 except 17.5.0 and node 18 and above. A downgrade to node 12 is not necessary.

And mongoose 6.3.2 does not has that issue, which you describe.