【问题标题】:Node.JS - Express: Coding styleNode.JS - Express:编码风格
【发布时间】:2016-01-13 03:30:35
【问题描述】:

我正在用 Node.JS 和 Express 编写一些 rest API。所以对于每个 API,我都需要做所有常见的事情,比如参数验证、身份验证、授权,然后是实际的业务逻辑。一些sodo代码来说明这一点:

router.get('/users', function (req, res){
    async.auto(
        authenticateCaller();
        authorizeCaller();
        validateParams();

        doGetUsers(); 
    )
})

这种风格确实有效,但是由于包含了许多额外的预用途代码,因此使整个功能变得非常麻烦。我知道在 web 应用程序编程中,已经引入了 MVC 来将 UI、Module 和 Controller 分成不同的代码组,这样更简洁。有没有类似的框架可以帮助实现这个目的?

【问题讨论】:

    标签: javascript node.js model-view-controller coding-style


    【解决方案1】:

    使用中间件。中间件只是一个接受三个参数的函数:

    function (req, res, next) {}
    

    在定义任何路由之前调用 router.use() 来注册中间件。这将导致在执行每个路由之前调用该中间件。

    这些都是中间件的功能:

    • authenticateCaller();
    • authorizeCaller();
    • validateParams();

    http://expressjs.com/en/guide/using-middleware.html

    【讨论】:

    • 谢谢马特。这是我缺少的基本内容。
    【解决方案2】:

    这就是我所做的。

    在 Node.js 中使用 Routes 在这里,我为一个名为 routes 的文件夹让路,其中包含所有代码。

    var routes = require('./routes');
    var route_add_user = require('./routes/add_user');
    

    这里用路由调用函数; .adduser 是该 js 文件中的函数名称

     app.get('/adduser', route_add_user.adduser);  
    

    【讨论】:

      【解决方案3】:

      定义一个函数来完成你的日常工作

       fuction auth(res,req,next){
           authenticateCaller();
          req.isAuthorized = authorizeCaller();
           validateParams();
           next();
          }
      
       router.get('/users',auth);
       router.get('/users', function (req, res){
         if( req.isAuthorized)
         {..do some stuff here..}
      })
      

      【讨论】:

        【解决方案4】:

        这是我在 express 框架中验证和使用 API 所遵循的样式之一。

        register.js
        -----------
        exports.addUser = function(req, res) { 
            // do something
        };
        exports.deleteUser = function(req, res) { 
            // do something
        };
        
        routes.js
        ---------
        var register = require('./register');
        router.get(‘/register’,auth, register.addUser);
        router.get(‘/deleteUser’,auth, register.deleteUser);
        // Better make it separate common file to reuse all the API
        function auth(req,res,next) { 
           // do something to authenticate your API
        }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多