code.Antrikshy | Notes, tinkerings, experiments

Run MongoDB Automatically With Your Node.js Project

Update: The database isn’t closed properly when tests fail, which causes some issues. I kind of gave up on this.

I thought I’d share this quick tip I came up with for my own convenience while working with Node.js. Every time I work on a MongoDB-powered Node.js project, I open a separate tab in Terminal and start MongoDB using the mongod command so that it runs in the background while I develop and test my project.

This is pretty inconvenient to do each time, so I thought I’d automate it as seamlessly as possible. Mostly, I wanted to keep my unit tests as independent from anything else as possible.

So I set up npm scripts like this (in my package.json):

"scripts": {
  "prestart": "mongod --dbpath data --fork --logpath /dev/null",
  "start": "node ./bin/www",
  "poststop": "mongo admin --eval 'db.shutdownServer()' > /dev/null",
  "pretest": "mongod --dbpath data --fork --logpath /dev/null",
  "test": "mocha test",
  "posttest": "mongo admin --eval 'db.shutdownServer()' > /dev/null"

In case you’re not sure where to put the above - "scripts" goes as a separate object in the package.json file in your project’s root folder.

Basically what the above does is that it makes sure that MongoDB is running when I run npm test to run my Mocha tests. It also closes the MongoDB server when the tests are completed. This is achieved through the pretest and posttest hooks.

Additionally, I have also created prestart and poststop hooks so that MongoDB also runs when I use npm start. After I’m done working, I close the server using Ctrl + C and run npm stop to cleanly shut the MongoDB server down.

In case you’re interested in what the two commands do:

mongod --dbpath data --fork --logpath /dev/null

The --fork flag starts a mongod process in the background. --logpath /dev/null means that no logs are saved. You can change this if you wish.

mongo admin --eval 'db.shutdownServer()' > /dev/null

The above is equivalent to running the mongo shell interface, entering use admin and executing the command db.shutdownServer(). This is because the Mac version does not support the --shutdown flag. If you are using Linux, you can replace the entire command above with mongod --shutdown and that will probably work. I pipe the output to /dev/null to keep things clean. It also seems to output an error, but it seems to work, so I prefer to suppress it this way.

If someone knows a way to make nodemon run npm start and npm stop somehow, please let me know how in the comments.

Talk to me via Twitter and check out my stuff on GitHub.