2016-04-03 23 views
2

私はこれをタイトルにすることは実際にはわかりませんが、私はNode.jsを初めて使っています。私はGitHub上できちんとしたREST APIプロジェクトを実装することができましたが、どのようにGETとPOSTなどを分割してファイルを分割するかはわかりません。Node.js APIの設計とルートの処理

var api = require('./api.js'); 

// Create router.get, router.post etc. here? 

答えて

1

が、私は、私は分割することができるかどうかはわかりません。

私は今、私は兄弟other.jsと使用を作成する方法

function API_ROUTER(router, connection, md5) { 
    var self = this; 
    self.handleRoutes(router, connection, md5); 
} 

API_ROUTER.prototype.handleRoutes = function(router, connection, md5) { 
    router.get("/", function(req, res) { 
     res.json({"Message" : "Hello World !"}); 
    }); 
}; 

module.exports = API_ROUTER; 

を持って1つの特異api.jsファイルを持っていますすべてのGETとPOSTなどでファイルを区切ります。

API /家庭:あなたはあなたのルートを整理することができ

一つの方法は、このようなパスとして、各(HTTPメソッドで区切って)ハンドラを持つルートおよびその他の必要な情報のために別のオブジェクトを持っているだろう。 JS

module.exports = { 
    path: '/', 
    handlers: { 
    'get': function(req, res) { 
      res.json({"Message" : "Hello World !"}); 
     }, 
     'post': { 
     // ... 
     } 
     // ... 
    } 
} 

API/other.js

module.exports = { 
    path: '/other', 
    handlers: { 
    'get': function(req, res) { 
     res.json({"Message" : "Other !"}); 
     }, 
    // ... 

次にあなたがの内側にこれらのすべてを読み込むことができますメソッド:

API_ROUTER.prototype.handleRoutes = function(router, connection, md5) { 
    var routes = ['home', 'other']; 

    routes.forEach(function(name) { 
    // load the current route object (NOTE: you should use the path module for determining file path in a cross-platform manner) 
    var routeObject = require('./' + name + '.js'); 

    var apiPath = routeObject.path; 
    var handlers = routeObject.handlers; 
    var methods = Object.keys(handlers); 

    // assign handlers for each method 
    methods.forEach(function(method) { 
     router[method](apiPath, handlers[method]); 
    }); 

    }); 
}; 

これにより、すべてのルートが適切な情報とハンドラでインストールされます。 今、あなたは、必要なデータを使用してAPI_ROUTERをインスタンス化することによって、このコードを呼び出すことができます。

// initialize the api (and handle the routes internally) 
var Api = new require('./api.js')(router, connection, md5); 
+1

routeObject変数に '.js'を追加するのを忘れてしまった。さもなければ、これは実用的な解決策であり、私はそれを実装するでしょう! – Rcls

+1

@Rcls nodejsは自動的に '.js'を追加します。接尾辞が 'require'より少ないという利点は、ファイルを後で_module_に置き換えることができるという利点があるためです(例えば、コードを小さな塊で分割する必要がある場合など)。 –

+0

情報ありがとう!実際にmodule.exportsを関数に変更して、接続パラメータを渡すことができます。 – Rcls

1

あなたがRESTfulなAPIを実装する場合は、あなたは、これはあなたがデータを提供することができますどのようにただ一つの方法であることに注意してください、そしてあなた必要があります将来的にAPIを変更したいかもしれませんが、APIのほとんどは翻訳レイヤーにすぎません。

通常、リソースに基づいてコードを分割します。要求を処理するコードはあまりロジックを持たないため、リクエストを受け取り内部APIに渡します。その目的のために、すでにexpress.jsまたは同様のライブラリを使用している場合は、実際には追加のレイヤーは必要ありません。

app.use([path,] function [, function...])では、コードをモジュール化するために必要な機能がすでに用意されています。それぞれのリソースに対して独自のexpress.Routerを作成し、それ自体が別のサブモジュールをマウントすることもあります。したがって、この部分では本当にライブラリは必要ありません。

するとライブラリが役に立つかもしれない:

  • それは自動的に完全にそれならば、あなたのAPI
  • にドキュメントを作成するためのツールが含まれている場合、それは自動的に正しい応答コード
  • にスローされたエラーを変換した場合コードを変更することなくexpresshapi、...にフックできるように、下位ルーティングシステムを抽象化します。ここでexpress.jsとセットアップが

    ./lib/rest/customer.js

    var customerSystem = require('../customer-system'); 
    var express = require('express'); 
    var router = new express.Router(); 
    
    router.get('/:id', function(req, res, next) { 
        customerSystem.find({ 
        id: req.params.id 
        }, function(err, customer) { 
        if (err) { 
         res.status(/*correct status code*/).send(/*depending on the api return json, xml, ....*/) 
        } else { 
         res.send(/*depending on the api return json, xml, ....*/) 
        } 
        }) 
    }); 
    
    router.delete('/:id', function(req, res, next) { 
        customerSystem.delete({ 
        id: req.params.id 
        }, function(err) { 
        //... 
        }); 
    }); 
    
    
    router.post('/', function(req, res, next) { 
        //... 
    }); 
    
    //save the customer id for the pass to the sub routers 
    router.use('/:id', function(req, res, next) { 
        req.customerId = req.params.id; 
        next(); 
    }); 
    
    router.use('/:id/addresses', require('./customer-address')) 
    
    module.exports = router; 
    

    ./lib/rest/customer-address.jsように見える可能性がどのよう

var customerSystem = require('../customer-system'); 
var express = require('express'); 
var router = new express.Router(); 

router.get('/:id', function(req, res, next) { 
    customerSystem.find({ 
    id: req.customerId 
    }, function(err, customer) { 
    // ... 
    }) 
}); 

/* ..... */ 

//save the address id for the pass to the sub routers 
router.use('/:id', function(req, res, next) { 
    req.addressId = req.params.id; 
    next(); 
}); 

router.use('/:id/addresses', require('./customer-address')) 

module.exports = router; 
+0

実際これから私はちょっとあなたが意味するものを理解しました。このようにする方がはるかに簡単です。はい、私は認めます。私がしたのはserver.jsの 'var router = express.Router()'です。これをrequire( './api/test')(ルータ、接続)に渡します。今はserver.jsに必要なすべてのルートファイルを必要とし、必要なものだけを持っています。ありがとう、これらの答えは本当にノードの仕組みを理解するのに役立ちます。 – Rcls

関連する問題