• [译] 第二十七天:Restify


    前言

    今天的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

  • 相关阅读:
    ExtJS 开发总结 子曰
    解决讨厌的VS2008不能打开vs2010所创建的项目问题 子曰
    提高网站页面加载速度的黄金守则 子曰
    更新网站注意事项 子曰
    dhl:SQL_游标.sql
    jQuery 中插件的使用与开发启用Visual Studio 对jQuery的智能感知(含 jQuery1.3.2 for VS 的智能提示js文件)
    用jQuery在IFRAME里取得父窗口的某个元素的值
    图片上传预览是一种在图片上传之前对图片进行本地预览的技术。
    dhl:ajax无法跨域改用getJSON(解决服务器返回json数据中文为乱码的问题$.ajaxSetup({ scriptCharset: "utf8" , contentType: "application/json; chars)
    dhl: URL的编码问题。
  • 原文地址:https://www.cnblogs.com/endless-on/p/3522914.html
Copyright © 2020-2023  润新知