mongodbcypressmongodb-nodejs-driver

MongoRuntimeError Unable to parse with URL


I am trying to connect to a mongo db using the nodejs mongo driver and I'm doing this in a cypress project. I get the error in the title. Below is the simplified version of my code.

import {MongoClient} from 'mongodb';

export class SomeRepository {

    static insertSomething(): void {
        // Error in the line below: MongoRuntimeError Unable to parse localhost:27017 with URL
        const client = new MongoClient('mongodb://localhost:27017');
    }
}

Mongodb is running because I can connect from the terminal. Also tried replacing localhost with 127.0.0.1 and adding the authSource parameter to the connection string.

The reason I'm mentioning cypress is because in a simple node project that only connects to mongodb everything works as expected. Package.json below

{
  "name": "e2e",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "cypress": "10.8.0",
    "cypress-wait-until": "1.7.2",
    "headers-utils": "3.0.2",
    "mongodb": "4.10.0",
    "otplib": "12.0.1",
    "pg": "8.7.3",
    "pg-native": "3.0.1",
    "typescript": "4.9.3"
  }
}

Solution

  • The reason it’s not working is because you’re calling a NodeJS library in a cypress test. Cypress tests run inside a browser and cannot run nodejs libraries.

    If you wanted to execute nodejs code in cypress you must create a cypress task https://docs.cypress.io/api/commands/task#Syntax

    // cypress.config.js
    import { SomeRepository } from ‘./file/somewhere’
    
    module.exports = defineConfig({
      e2e: {
        setupNodeEvents(on, config) {
          on(‘task’, {
            insertSomething() {
              return SomeRepository.insertSomething();
            }
          }
        }
      }
    })
    
    // to call in a cypress test
    it(‘test’, function () {
        cy.task(‘insertSomething’).then(value => /* do something */);
      }
    });