[譯] 第二十七天:Restify - 用Node.js創建正確的REST Web服務


前言

今天的30天挑戰,我決定學習Node.js模塊Restify, restify使得用Node.js寫正確的RESTful API很方便,提供即裝即用的功能支持,如版本,錯誤處理,CORS和內容協議,它特意借鑒大量的Express,因為或多或少實際Web程序API是基於node.js. 本文我們來開發一個RESTful API存儲作業,我們保存數據到MongoDB

Restify前提准備

Restify需要NodeJS和node.js安裝時自帶的NPM包管理器,你可以從官網下載最新的NodeJS,下載和安裝后,我們用NPM安裝Harp. 

程序會用MongoDB做數據存儲,請下載最新MongoDB

安裝Restify

在你機器上新建目錄。

$ mkdir myapp
$ cd myapp
View Code

輸入以下命令安裝restify模塊。

$ npm install restify
View Code

我們用MongoJS作MongoDB驅動,輸入以下命令安裝mongojs模塊。

$ npm install mongojs
View Code

寫RESTful API

安裝完restify和mongojs后,開始寫代碼,新建一個app.js的文件。

$ touch app.js
View Code

復制粘貼以下內容到app.js.

var restify = require('restify');
var mongojs = require("mongojs");
View Code

以上兩行用需要的功能下載了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);
});
View Code

以上代碼新建了個服務,createServer()接收一個可選對象,我們在對象里傳給myapp作為服務名,你可以從文檔里查看完整選擇列表。創建好服務實例后,我們調用listen功能傳遞端口,IP和回調功能。 

輸入以下命令運行程序。

$ node app.js
View Code

你可以在命令行終端上看到

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());
View Code

以上三行:

  1. Restify.queryParser()插件用於分析HTTP查詢字串(如,/job?skills=java.mysql),      這些解析內容也始終在req.query里可用。
  2. Restify.bodyParser()      關注在服務器上自動將你的請求數據轉換成JavaScript對象。
  3. Restify.CORS() 在程序里配置CORS

配置MongoDB

在加路由前,先把添加連接到到myapp MongoDB數據庫的代碼。

var connection_string = '127.0.0.1:27017/myapp';
var db = mongojs(connection_string, ['myapp']);
var jobs = db.collection("jobs");
View Code

以上代碼,我們連接了本地MongoDB實例,接下來,用數據庫對象獲取作業收集。 

寫CRUD API

現在,我們已經有了服務器和數據庫部分,還需要路由來定義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);
View Code

以上代碼:

  1. 當用戶發出GET請求到'/jobs', findAllJobs回調會被調用,另一個有趣的是路由的版本用法,客戶端可以用Accept-Version指定版本。
  2. 當用戶發出GET請求到'/jobs/123', findJob回調會被調用。
  3. 當用戶發出POST請求到'/jobs', postNewJob回調會被調用。
  4. 當用戶發出DELETE請求到'/jobs/123', 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);
        }
    }) 
}
View Code

以上代碼不言而喻,我們用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
View Code

要查看所有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"}]
View Code

部署到雲

在部署到OpenShift上之前,需要先做幾步:

  1. OpenShift上注冊。OpenShift完全免費,紅帽給每個用戶免費提供了3個Gears來運行程序。目前,這個資源分配合計有每人1.5GB內存,3GB磁盤空間。
  2. 在本機安裝rhc 客戶端工具,rhc是ruby gem包,所以你需要安裝1.8.7或以上版本的ruby。安裝rhc,輸入 sudo      gem install rhc. 如果已經安裝了,確保是最新的,要更新rhc,輸入sudo gem update rhc. 想了解rhc command-line 工具,更多幫助參考 https://www.openshift.com/developers/rhc-client-tools-install.
  3. 用rhc setup 命令安裝OpenShift. 執行命令可以幫你創建空間,上傳ssh 密鑰到OpenShift服務器。 

安裝后,可以運行以下命令創建OpenShift程序。

$ rhc create-app day27demo nodejs-0.10 mongodb-2 --from-code https://github.com/shekhargulati/day27-restify-openshift-demo.git
View Code

它會執行所有從創建程序,到設置公共DNS, 到創建git私有倉庫,最后用Github倉庫的代碼發布應用。程序運行在 http://day27demo-{domain-name}.rhcloud.com//

這是今天的內容,繼續給反饋吧。 

原文:https://www.openshift.com/blogs/day-27-restify-build-correct-rest-web-services-in-nodejs


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM