Simple NodeJS/mongoDB API
##Objective This will help solidify your understanding of mongoDB alongside of NodeJS using a popular ORM for mongo called mongoose You'll build a public API of extinct mammals retrieved from Wikipedia: http://en.wikipedia.org/wiki/List_of_extinct_mammals
##Day One ###Step 1: Build your project
- Create your package.json file with mongoose and express as dependencies
- Make sure mongod is running in your terminal
- Create a server.js file that will hold all of your API's logic
- Be sure to require and initialize express
###Step 2: Setup the mongoDB connection (reference: http://mongoosejs.com/docs/)
- In your server.js require the mongoose library and create a connection to your database server
- Create your mammalSchema with three fields:
name
,type
, andyear_extinct
- Use express to create two endpoints on
/
, one a GET and one a POST
- returns a JSON array of all extinct mammals, ordered by name
- saves a new Mammal model based on the fields given in the JSON request
###Step 3: Insert some data
- Using your new API and the wikipedia article, add some extinct mammals: http://en.wikipedia.org/wiki/List_of_extinct_mammals
##Day Two ###Step 4: Break up your project into multiple modules
- (You can use https://gist.github.com/fwielstra/1025038 as a good example)
- Create an api.js to hold your
get
andpost
calls - Create a mammal.js that contains the schema and model creation for
Mammal
- Create an app.js file that brings everything together:
- it should require the express and mongoose modules
- it should instantiate express and connect to the mongo server
- it should require the api module and connect the endoints to their appropriate functions in api.js
- it should start the server listening on a desired port
###Step 5: Routing and fetching
- Use a more complicated routing structure for your
GET /
call:- change the route to point to
/mammals
rather than just/
- make it so that if someone requests
/mammals/marsupials
ormammals/rodents
the call will return only mammals of that type - include an
order_by
query param that instructs the API to order the results by the given field
- change the route to point to
###Step 6 (Black Diamond): Query by id
- Use regex to determine whether someone is asking for
/mammals/:id
or/mammals/:type
and return the appropriate response
##Integration Tests with Jasmine ###Step 1: Create your spec file You can name it whatever you'd like, but since we're testing the API, let's call it test/spec/apispec.js ###Step 2: Make sure you have the correct setup
- Make sure mongodb is running (either in another tab or via
mongod &
) - Make sure
node app.js
is running and has no problems - Make sure you're required the
request
lib in your spec - "Describe" your test case, maybe something like "tests the api"
###Step 3: Create a spec to make sure GET /mammals
returns data
- NOTE: make sure you have some data in your collection
- Hint: Use the "toThrow" matcher in Jasmine to make sure try to parse JSON from the response body doesn't throw an error:
request("http://localhost:8888/mammals", function(err, response, body) {
var checkJSON = function() {
//if body isn't valid JSON, this will throw an error and break stuff
JSON.parse(body);
}
expect(checkJSON).not.toThrow();
done();
});
###Step 4: Create specs to make sure both variations of /mammals
work
GET /mammals
should work as well as /mammals/marsupial
(or however you input the type)
###Step 5: Create a spec to ensure that POST /mammals
works
You're going to need to utilize the post method of the request library, like so:
request({
uri: url+"/mammals",
method: 'POST',
json: {
"name": "TEST MAMMAL",
"type": "test",
"year_extinct": 2013
}
}, function(err, response, body) {
//code for assertion and done() here
});