Day 27: Restify —— 在Node.js中构建正确的REST Web服务
今天決定學(xué)一個叫做restify的Node.js模塊。restify模塊使得在Node.js中寫正確的REST API變得容易了很多,而且它還提供了即裝即用的支持,如版本控制、錯誤處理、CORS和內(nèi)容協(xié)商。它大量地借鑒了Express(故意地),因為這或多或少是事實上的API來寫在node.js上寫web應(yīng)用程序,將數(shù)據(jù)存儲在MongoDB中。
Restify準備
Restify需要NodeJS和NPM包管理器,這個可以是隨node.js安裝時默認的。如果已經(jīng)安裝了node.js和NPM,就可以用NPM系統(tǒng)來安裝Harp了。
此應(yīng)用程序使用MongoDB作數(shù)據(jù)存儲。
Restify安裝
在任何方便的目錄中的文件系統(tǒng)上創(chuàng)建一個新的目錄:
$ mkdir myapp $ cd myapp輸入下面命令,安裝restify模塊:
$ npm install restify使用MongoJS作為MongoDB的驅(qū)動程序,輸入下面命令安裝mongojs模塊:
$ npm install mongojs編寫基于REST的API
現(xiàn)在已經(jīng)安裝了restify和mongojs創(chuàng)建一個名為app.js的新文件:
$ touch app.js把下面內(nèi)容粘貼進app.js:
var restify = require('restify'); var mongojs = require("mongojs");這是加載restify和mongojs模塊,并給它們分配變量。
現(xiàn)在,創(chuàng)建一個使用restify API的新服務(wù)器:
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() 函數(shù)接受一個選擇對象,將myapp作為選擇對象的服務(wù)器的名稱傳遞給它,也可以在這份文檔中查看選項的完整的選項列表。創(chuàng)建服務(wù)器實例之后,通過端口、ip地址和一個回調(diào)函數(shù)調(diào)用listen函數(shù)。
運行程序:
$ node app.js然后會看見如下命令行:
myapp listening at http://127.0.0.1:8080配置插件
restify模塊有很多內(nèi)置的插件,把下面內(nèi)容復(fù)制并粘貼到app.js,應(yīng)該加在server.listen() 函數(shù)前面。請參閱這份文檔以了解所有被支持的插件。
server.use(restify.queryParser()); server.use(restify.bodyParser()); server.use(restify.CORS());上述代碼表示:
MongoDB的配置
在添加路由之前,添加代碼來連接到MyApp的MongoDB數(shù)據(jù)庫:
var connection_string = '127.0.0.1:27017/myapp'; var db = mongojs(connection_string, ['myapp']); var jobs = db.collection("jobs");現(xiàn)在,已經(jīng)連接到本地MongoDB實例。接下來,需要得到使用數(shù)據(jù)庫對象的工作集合。
寫CRUD API
現(xiàn)在,服務(wù)器和數(shù)據(jù)庫已經(jīng)準備了。仍然需要路由來定義API的行為,復(fù)制并粘貼以下代碼到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);上述代碼執(zhí)行以下操作:
現(xiàn)在編寫回調(diào)函數(shù),復(fù)制并粘貼進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);}})}使用curl測試Web服務(wù),輸入下面命令創(chuàng)建一個“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"}]部署到云端
在應(yīng)用程序部署到OpenShift之前,座以下幾個設(shè)置:
設(shè)置完成后,輸入以下命令創(chuàng)建一個新的OpenShift應(yīng)用程序:
$ rhc create-app day27demo nodejs-0.10 mongodb-2 --from-code https://github.com/shekhargulati/day27-restify-openshift-demo.git它會完成所有的工作,從創(chuàng)建一個應(yīng)用程序、建立公共DNS、創(chuàng)建私有的git倉庫到最后使用代碼從Github資源庫部署應(yīng)用程序。該應(yīng)用程序可以在這里訪問 http:// day27demo-{domain-name}.rhcloud.com//
今天就這些,歡迎反饋。
原文 Day 27: Restify--Build Correct REST Web Services in Node.js
翻譯整理 SegmentFault
總結(jié)
以上是生活随笔為你收集整理的Day 27: Restify —— 在Node.js中构建正确的REST Web服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Day 25: 联合Tornado、Mo
- 下一篇: Day 28: OpenShift的Ec