今天的30天挑战,我决定学习Node.js模块Restify, restify使得用Node.js写正确的RESTful API很方便,提供即装即用的功能支持,如版本,错误处理,CORS和内容协议,它特意借鉴大量的Express,因为或多或少实际Web程序API是基于node.js. 本文我们来开发一个RESTful API存储作业,我们保存数据到MongoDB.
Restify需要NodeJS和node.js安装时自带的NPM包管理器,你可以从官网下载最新的NodeJS,下载和安装后,我们用NPM安装Harp.
程序会用MongoDB做数据存储,请下载最新MongoDB.
在你机器上新建目录。
$ mkdir myapp
$ cd myapp
输入以下命令安装restify模块。
$ npm install restify
我们用MongoJS作MongoDB驱动,输入以下命令安装mongojs模块。
$ npm install mongojs
安装完restify和mongojs后,开始写代码,新建一个app.js的文件。
$ touch app.js
复制粘贴以下内容到app.js.
var restify = require('restify'); var mongojs = require("mongojs");
以上两行用需要的功能下载了restify和mongojs模块并指定参数。
现在,用restify API新建服务。
var restify = require('restify'); var mongojs = require("mongojs"); var ip_addr = '127.0.0.1'; var port = '8080'; var server = restify.createServer({ name : "myapp" }); server.listen(port ,ip_addr, function(){ console.log('%s listening at %s ', server.name , server.url); });
以上代码新建了个服务,createServer()接收一个可选对象,我们在对象里传给myapp作为服务名,你可以从文档里查看完整选择列表。创建好服务实例后,我们调用listen功能传递端口,IP和回调功能。
输入以下命令运行程序。
$ node app.js
你可以在命令行终端上看到
myapp listening at http://127.0.0.1:8080
Restify 模块有大量我们可用的内置插件,复制粘贴以下代码到app.js, 贴在server.listen()之前,参考文档了解所有支持的插件。
server.use(restify.queryParser());
server.use(restify.bodyParser());
server.use(restify.CORS());
以上三行:
在加路由前,先把添加连接到到myapp MongoDB数据库的代码。
var connection_string = '127.0.0.1:27017/myapp'; var db = mongojs(connection_string, ['myapp']); var jobs = db.collection("jobs");
以上代码,我们连接了本地MongoDB实例,接下来,用数据库对象获取作业收集。
现在,我们已经有了服务器和数据库部分,还需要路由来定义API的行为,复制粘贴以下代码到app.js.
var PATH = '/jobs' server.get({path : PATH , version : '0.0.1'} , findAllJobs); server.get({path : PATH +'/:jobId' , version : '0.0.1'} , findJob); server.post({path : PATH , version: '0.0.1'} ,postNewJob); server.del({path : PATH +'/:jobId' , version: '0.0.1'} ,deleteJob);
以上代码:
现在来写回调,复制粘贴以下代码到app.js.
function findAllJobs(req, res , next){ res.setHeader('Access-Control-Allow-Origin','*'); jobs.find().limit(20).sort({postedOn : -1} , function(err , success){ console.log('Response success '+success); console.log('Response error '+err); if(success){ res.send(200 , success); return next(); }else{ return next(err); } }); } function findJob(req, res , next){ res.setHeader('Access-Control-Allow-Origin','*'); jobs.findOne({_id:mongojs.ObjectId(req.params.jobId)} , function(err , success){ console.log('Response success '+success); console.log('Response error '+err); if(success){ res.send(200 , success); return next(); } return next(err); }) } function postNewJob(req , res , next){ var job = {}; job.title = req.params.title; job.description = req.params.description; job.location = req.params.location; job.postedOn = new Date(); res.setHeader('Access-Control-Allow-Origin','*'); jobs.save(job , function(err , success){ console.log('Response success '+success); console.log('Response error '+err); if(success){ res.send(201 , job); return next(); }else{ return next(err); } }); } function deleteJob(req , res , next){ res.setHeader('Access-Control-Allow-Origin','*'); jobs.remove({_id:mongojs.ObjectId(req.params.jobId)} , function(err , success){ console.log('Response success '+success); console.log('Response error '+err); if(success){ res.send(204); return next(); } else{ return next(err); } }) }
以上代码不言而喻,我们用Mongojs API执行CRUD操作。
我们可以用curl测试web services, 要新建job, 输入以下命令。
$ curl -i -X POST -H "Content-Type: application/json" -d '{"title":"NodeJS Developer Required" , "description":"NodeJS Developer Required" , "location":"Sector 30, Gurgaon, India"}' http://127.0.0.1:8080/jobs
要查看所有jobs.
$ curl -is http://127.0.0.1:8080/jobs HTTP/1.1 200 OK Access-Control-Allow-Origin: * Content-Type: application/json Content-Length: 187 Date: Sun, 24 Nov 2013 16:17:27 GMT Connection: keep-alive [{"title":"NodeJS Developer Required","description":"NodeJS Developer Required","location":"Sector 30, Gurgaon, India","postedOn":"2013-11-24T16:16:16.688Z","_id":"52922650aab6107320000001"}]
在部署到OpenShift上之前,需要先做几步:
安装后,可以运行以下命令创建OpenShift程序。
$ rhc create-app day27demo nodejs-0.10 mongodb-2 --from-code https://github.com/shekhargulati/day27-restify-openshift-demo.git
它会执行所有从创建程序,到设置公共DNS, 到创建git私有仓库,最后用Github仓库的代码发布应用。程序运行在 http://day27demo-{domain-name}.rhcloud.com//
这是今天的内容,继续给反馈吧。
原文:https://www.openshift.com/blogs/day-27-restify-build-correct-rest-web-services-in-nodejs