This is my memo.
tree
% tree -I 'node_modules' . ├── package.json └── server.js 0 directories, 2 files
package.json
% cat package.json { "name": "Gang2", "version": "0.0.0", "description": "", "main": "index.js", "dependencies": { "restify": "~2.7.0", "save": "~0.0.20" }, "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" }
server.js
% cat server.json var restify = require('restify'), save = require('save'); var resources = {}; function getResource(name) { if (!resources[name]) { resources[name] = save(name); } return resources[name] } var server = restify.createServer({ name: 'REST demo server' }) server .use(restify.fullResponse()) .use(restify.bodyParser()) .use(function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Credentials", true); res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header("Access-Control-Allow-Headers", "Content-Type"); next(); }); server.post('/:resource', function(req, res, next) { if (req.params.name === undefined) { return next(new restify.InvalidArgumentError('Name must be supplied')) } getResource(req.params.resource).create({ name: req.params.name }, function(error, resource) { if (error) return next(new restify.InvalidArgumentError(JSON.stringify(error.errors))) res.send(201, resource) }) }) server.get('/:resource', function(req, res, next) { getResource(req.params.resource).find({}, function(error, resources) { res.send(resources) }) }); server.get('/:resources/:id', function(req, res, next) { getResource(req.params.resources).findOne({ _id: req.params.id }, function(error, resource) { if (error) { return next(new restify.InvalidArgumentError(JSON.stringify(error.errors))) } if (resource) { res.send(resource) } else { res.send(404) } }) }) server.put('/:resources/:id', function(req, res, next) { if (req.params.name === undefined) { return next(new restify.InvalidArgumentError('Name must be supplied')) } getResource(req.params.resources).update({ _id: req.params.id, name: req.params.name }, function(error, resource) { if (error) { return next(new restify.InvalidArgumentError(JSON.stringify(error.errors))); } res.send(resource) }) }) server.del('/:resources/:id', function(req, res, next) { getResource(req.params.resources).delete(req.params.id, function(error, user) { if (error) { return next(new restify.InvalidArgumentError(JSON.stringify(error.errors))); } res.send() }) }) server.listen(3000, function() { console.log('%s listening at %s', server.name, server.url) });
npm install
% npm install
run it
% node server.js
cURL
GET
% curl -i http://localhost:3000/users
POST
% curl -i -X POST -d 'name=taro' http://localhost:3000/users % curl -i http://localhost:3000/users % curl -i -X POST -d 'name=jiro' http://localhost:3000/users % curl -i http://localhost:3000/users
PUT
% curl -i -X PUT -d 'name=ichiro' http://localhost:3000/users/1 % curl -i http://localhost:3000/users
DELETE
% curl -i -X DELETE http://localhost:3000/users/1 % curl -i http://localhost:3000/users