0

私は node.js を使い始めて、いくつかの安らかな API を表現しています。ロジックをコントローラーに分割しています。各コントローラーには、API の実行内容に対応するメソッドがいくつかあります。新しい機能を既存のコントローラーに追加するたびに、または新しいコントローラーでまったく新しい機能を追加するたびに、ルートを更新する必要はありません。そのために、単純な一連のルートで定義された安らかな API を作成し、既存のコントローラーとメソッドに基づいて物事を理解するのに十分なほどスマートにしようとしています。そのために、私はこれを持っています...

"use strict";

module.exports = function (app) {
    var routes = [
        {
            'get'        : true,
            'put'        : false,
            'post'       : false,
            'update'     : false,
            'delete'     : false,
            'controller' : '',
            'action'     : 'search',
            'url'        : '/:controller/search/:query/:page?'
        },
        {
            'get'        : true,
            'put'        : false,
            'post'       : false,
            'update'     : false,
            'delete'     : false,
            'controller' : '',
            'action'     : '',
            'url'        : '/:controller/'
        },
        {
            'get'        : true,
            'put'        : false,
            'post'       : true,
            'update'     : true,
            'delete'     : true,
            'controller' : '',
            'action'     : '',
            'url'        : '/:controller/:id'
        },
        {
            'get'        : true,
            'put'        : false,
            'post'       : true,
            'update'     : false,
            'delete'     : false,
            'controller' : '',
            'action'     : '',
            'url'        : '/:controller/:id/:action'
        }
    ];

    function setupRoute(method, item) {
        if (method in item && item[method]) {
            console.log('Init route: ' + method.toUpperCase() + ' ' + item.url);
            app[method](item.url, function(req, res) {
                var c = '';
                if ('controller' in item) {
                    c = item.controller;
                }
                var a = '';
                if ('action' in item) {
                    c = item.action;
                }

                if ('controller' in req.params) {
                    c = req.params.controller;
                }
                if ('action' in req.params) {
                    a = req.params.action;
                }
                if (c == '') {
                    c = 'default';
                }
                if (a != '') {
                    a += '_';
                }
                a += req.method.toLowerCase();

                c = c.toLowerCase();
                a = a.toLowerCase();

                if (c in app.controllers) {
                    if (a in app.controllers[c]) {
                        app.controllers[c][a](req, res);
                    } else {
                        console.log('Unknown action on controller ' + a);
                        res.status(400).send('Bad Request');
                    }
                } else {
                    console.log('Unknown Controller  ' + c);
                    res.status(404).send('Not found');
                }
            });
        } else {
            app[method](item.url, function(req, res) {
                res.status(405).send('Method Not Allowed');
            }
        }
    }

    routes.forEach(function(item) {     
        setupRoute('get', item);
        setupRoute('put', item);
        setupRoute('post', item);
        setupRoute('update', item);
        setupRoute('delete', item);
    });
}

このように設定することに問題はありますか?

これを行うためのより良い方法はありますか?

4

2 に答える 2

2

node.js でルートを分割するさまざまな方法を試しました。小さなアプリを実行している場合、それらを app.js に直接配置することは理にかなっていますが、多数の異なるコントローラーによって処理される多数の異なるルートを使い始めると、すぐに面倒になる可能性があります。あなたがやろうとしていることがうまくいくなら(そして私は広範なテストをお勧めします)、そのようにすることは問題ないと思いますが、うまくいくだけの複雑な「魔法」は遅く、維持するのが難しいことを覚えておいてください.デバッグが困難です。私はしばらくの間、同様のことをしようとしていましたが、最終的にはすべてのコントローラーに「register_routes」メソッドを追加して単純化することにしました。だから、このようなもの:

module.exports = {
    register_routes: function(app, callback) {
        app.get('/something', function(req, res){
            // Do stuff
        });
        callback();
    }
}

そして、routes/index.js で

module.exports = [
    require('./something'),
    require('./something_else') // etc...
];

そして app.js で

var controllers = require('routes');
async.eachSeries(controllers, function(controller, cb){
    controller.register_routes(app, cb);
}, function(err){
    // done
});

ルートが正しい順序で登録されるように、 register_routes 内でコールバックを使用することをお勧めします。

Express で不適切なルートを構築する方法はおそらくありますが、一般に、それが機能する場合は問題ありません (特にそれがあなたのプロジェクトの場合)。

ただし、danielepolencic が示唆したように、ルーティングをより自然に処理する他のフレームワークが好きかもしれません。

于 2013-08-24T14:14:40.567 に答える
0

通常の方法で高速にアプリをビルドするよりも、すべてのルートを含む構成ファイルを用意することを好むように思えます。その場合は、Hapiに切り替えることをお勧めします。Hapi は、構成オブジェクトから API を簡単に構築できる構成中心のフレームワークです。これはまさにあなたがやろうとしていることのように聞こえます。

于 2013-08-24T09:50:40.837 に答える