Yeoman, Mongoose, and MongoDB Scaffolding

In our previous post, we talked about getting started with Mongoose and MongoDB. In this post, we’ll show you how to use Yeoman and scaffold a new Mongoose/Express project for MongoDB.

Yeoman is a scaffolding tool, that scaffolds out projects using Grunt, Bower, and Node. There are times when you end up cut and pasting boilerplate code around to create a new project. This is precisely what Yeoman does, but with a single command and a few awesome generators.

Yeoman uses Grunt as the task runner to perform run/build/test tasks. If you want to use Gulp for the same, you can check out Slush. Slush is also a Scaffolding tool but uses Gulp as the task runner.

Getting Started with Yeoman

To make our lives easy, we will be using a Super Awesome Yeoman Generator named generator-mongoose, which will help us in setting up a new project as well as help us in scaffolding schemas.

This generator uses Express.js as the server, HTML for templating and a tinge of Bootstrap CSS to make things look good.

Let’s create a new folder and name it yoMongoose. CD into the folder and run the following:

To install Yeoman:

[sudo] npm install -g yo

To install generator-mongoose:

[sudo] npm install -g generator-mongoose

and finally, to scaffold a new project, run:

yo mongoose

Fill in the question like:

[?] Database Name: (myDb) myTestDB
[?] Database Host: (localhost) localhost
[?] Database User: {hit return}
[?] Database Password: {hit return}
[?] Database Port: (27017) 27017
[?] Will you be using heroku? (Y/n)  n

And Yeoman will go off and scaffold a new project for you. Your folder structure should consist of a /node_modules folder and a public/bower_components. If you do not see either of them, please run npm install and bower install.

To run the app, execute:

grunt

This will start off the express server and launch the home page in your default browser. The default page you see is a list of routes configured in the application.

Back to the folder and let’s have a quick walkthrough of the app.

  • config/db.js

    Consists of the DB configs and some options you can mess around with.

  • models/post.js

    An example schema of a blog post. All the other models we’re going to scaffold with the sub-generator will appear here.

  • public/

    Consist of the JavaScript and CSS needed for the UI.

  • routes/
index.js

    Consist of the default route that will dispatch the index.html
post.js, and consists of 5 key endpoints you’ll need to interact with the posts collection.

  • test/

    Consists of the test for Post route and its methods.

  • views/

    Consists of all the templates and views sent to the client.

To get a feel for where things go in a modular Express app, I recommend taking a peek at the following in order:

config/db.js
models/post.js
routes/post.js
app.js

Once you’re done, we’ll scaffold another model named articles using the sub-generator.

Back to terminal/prompt and run:

yo mongoose:schema "article|title:String,excerpt:String,content:String,published:Boolean,created:Date"

The above command will create those 3 files and result in:

Your creating a schema for article
With the fields: title,excerpt,content,published,created
starting request to schematic for test mock data...
create routes/article.js
create models/article.js
create test/test-article.js

The models/article.js will consist of all the fields listed after the pipe symbol in the command. Sweet right?

To see the result and an updated list of routes, run:

grunt

Dig into the newly generated files, and with practically zero effort, we were able to generate an Express/Mongoose app.

Hope you got a basic understanding of Scaffolding Express/Mongoose apps.

Thanks for reading. Do comment.
@arvindr21


Arvind Ravulavaru is a passionate web developer, likes experimenting with new and upcoming technologies. He also blogs at http://thejackalofjavascript.com


  • Pingback: Getting started with MongoDB & Mongoose()

  • acveer

    after ‘yo mongoose’ scaffold, I am getting an exception for the default server url ‘/’, when we run ‘grunt’ to start the server. The app does get connected successfully to mongodb, but getting error with routes. From what I know, I could not figure out why the app._routes.map is coming as undefined. Created an issue here https://github.com/afj176/generator-mongoose/issues

    TypeError: Cannot read property ‘get’ of undefined
    at route.index (C:PAwsmongodbyoMongooseApp1routesindex.js:11:33)
    at Layer.handle [as handle_request] (C:PAwsmongodbyoMongooseApp1node_modulesexpresslibrouterlayer.js:76:5)
    at next (C:PAwsmongodbyoMongooseApp1node_modulesexpresslibrouterroute.js:100:13)
    at Route.dispatch (C:PAwsmongodbyoMongooseApp1node_modulesexpresslibrouterroute.js:81:3)
    at Layer.handle [as handle_request] (C:PAwsmongodbyoMongooseApp1node_modulesexpresslibrouterlayer.js:76:5)

  • acveer

    your package slush-mango did it (gulp). Thank you. I was able to get all the default routes along with article also. Tests also pass. Its pretty cool, that all the CRUD operations & tests are generated with no effort. I sincerely appreciate your tutorials & effort. You are an awesome contributor.

  • Britton Winterrose

    Super helpful, thank you. So many tutorials skip over this part and the way you explain was very clear.

1 Shares
+1
Tweet
Share1
Share
Pin