Finishing the REST api is the easy part. Make a folder with the path api/v1/ inside the routes folder. Inside the api folder is another folder called v1. I do this just out of habit. APIs will change in even in a production environments. When that happens, I just add a v2 folder. It's just a cheap and easy way to future proof REST API endpoints.
After the folders, create a posts.js file inside.
var express = require('express'); var router = express.Router(); var mongoose = require('mongoose'); // Get the model var post = mongoose.model('Post'); // GET /api/v1/posts - GET ALL router.get('/', function (req, res) { post.find({}, function (err, posts) { res.json(posts); }); }); // GET /api/v1/posts/:post_id router.get('/:post_id', function(req, res) { post.findById(req.params.post_id, function(err, post) { if (err) res.send(err); res.json(post); }); }); // POST /api/v1/posts router.post('/', function(req, res) { var newPost = new Post(); newPost.title = req.body.title; newPost.body = req.body.body; newPost.author = req.body.author; newPost.published = req.body.published; newPost.save(function(err) { if (err) res.send(err); res.json({ message: 'Post created!' }); }); }); // PUT /api/v1/posts router.put('/', function(req, res) { post.findById(req.params.post_id, function(err, post) { if (err) res.send(err); post.title = req.body.title; post.body = req.body.body; post.author = req.body.author; post.published = req.body.published; post.meta.favs = req.body.favs; post.meta.dvotes = req.body.dvotes; post.meta.uvotes = req.body.uvotes; post.save(function(err) { if (err) res.send(err); res.json({ message: 'Post updated' }); }); }); }); // DELETE /api/v1/posts/:post_id router.delete('/:post_id', function(req, res) { post.findByIdAndRemove(req.params.post_id, function(err, post) { if (err) res.send(err); res.json({ message: 'Post deleted!' }); }); }); module.exports = router;
The whole thing should be fairly easy to figure out since this is the actual CRUD stuff.
Run the project and we should see our web page. Now we move to Fiddler to see around our API. Remember, you can just Postman instead of fiddler.
Start here: The Composer Tab in Fiddler |
You'll be able to go to the other tabs to see a lot of information.
The Inspectors tab contents is what we are interested in. This is where we see what's inside the reply from our API (or lack thereof if that is what we are expecting).
And finally, tests for our REST API endpoints. I wanted to add tests for our API to ensure behavior and for regression. It just makes sure I don't break the API as we continue working on this little project of ours.
We will be using the Frisby framework. Frisby is made to test REST API on node.js projects.
So, we install Frisby. Open a terminal, navigate to the project folder and type in:
npm install -g --save frisby
That should install the latest frisby version and save it a dependency in our package.json file. When frisby installed, create a folder named spec and inside that another folder named api. Inside these folders, a javascript file named posts_spec.js.
var frisby = require('frisby'); var baseURL = 'http://localhost:1337/'; // just replace if on live server frisby.create('Status 200 for GET /api/v1/posts is returned') .get(baseURL + 'api/v1/posts') .expectStatus(200) .toss(); frisby.create('Status 200 for GET /api/v1/posts/:id') .get(baseURL + 'api/v1/posts/5525f1e3f6a7f3a00b234a09') .expectStatus(200) .expectJSON({ 'author': 'jaypax' }) .toss();
Here we have two tests. Feel free to add more.
Now we just need to run it for which we need jasmine-node.
npm install -g --save jasmine-node
After NPM is done, you should be able to run the command in your terminal: jasmine-code spec/api/
Friby results after running the test |
You basically have two terminals open: 1 terminal running the project and other terminal to run the test from.
Clone the code at the github repo.