【问题标题】:NodeJS ModulizationNodeJS 模块化
【发布时间】:2014-06-29 12:10:03
【问题描述】:

所以,有人告诉我,在 nodeJS 中传递 request 和或 response 变量是“不好的做法”。但这意味着你的大部分代码都必须在 server.js 文件中,这使得它变得混乱而且有点难看。

您如何模块化您的 nodejs 服务器,适当地传递 req/res 并能够将您的代码组织到单独的文件中?

例如,我想将我的套接字路由.get.post 拆分到不同的文件中,但仍然可以像这样使用回调参数:

app.io.route("disconnect", function(req,res) { <--- these params
    db.query("UPDATE player_data SET online=0 WHERE id="+mysql.escape(req.session.user));
    req.io.broadcast("event", {msg:req.session.username+" has logged out!"});
    app.io.broadcast("reloadXY");
});

到目前为止,它们都在一个文件中,我不喜欢这样。

【问题讨论】:

    标签: javascript node.js express modularity


    【解决方案1】:

    这段来自 TJ Holowaychuk(编写 Express 和我们都使用的大量其他 Node 基础设施的人)的视频帮助我将 Express 模块化提升到了一个新的水平。基本上,您可以在自己的文件夹中制作单个应用程序,并将它们作为中间件非常容易地使用。我已经设法通过一些技巧将此技术扩展到 socket.io。

    http://vimeo.com/56166857

    【讨论】:

    • 补充链接很棒,但不应该包含你答案的关键。
    【解决方案2】:

    我认为这个人所说的“路过”是这样的(直截了当):

    app.get('/kittens', function(req, res) {
      db.doAthing(req);
      updateSomethingElse(res);
      upvoteThisAnswer(res);
    });
    

    也就是说,传递第一个函数之外的两个变量。这很糟糕,因为越来越难以确定通话的实际结束位置。 updateSomethingElse 中的一个小res.end(500) 可能会导致整个纸牌屋倒塌。

    在其他地方(通常是项目的/routes 目录)声明回调是完全可以的(事实上,标准到成为 express 中的默认值)。

    // app.js
    
    var user = require('./routes/user')
      , kittens = require('./routes/kittens');
    
    // express stuff...
    
    app.get('/settings', user.getSettings);
    app.get('/fur', kittens.shed);
    

    然后,在routes/user.js

    exports.getSettings = function(req, res) {
      // Note how we're passing around properties of req/res, not the objects themselves.
      db.getUserSettings(req.user.id).then(function(settings) {
        res.render('settings', settings);
      });
    };
    

    【讨论】:

      【解决方案3】:

      您不应将 req 和 res 传递给其他模块,而应将来自其他模块的回调传递给路由。 它应该看起来像。

      var someModule = require("./someModule")
      
      app.get("/someAction", someModule.handleSomeAction) ;
      

      如果您想发布并进入另一个模块,您应该将应用程序的引用(来自 express())一次传递给该模块并对其进行操作。

      例如:

      var express = require("express") ;
      var app = express();
      var get_handler = require("./get_handler ")
      var post_handler = require("./post_handler ")
      
      get_handler.init(app);
      post_handler.init(app);
      

      在 post/get_handler 中:

      var app;
      exports.init = function( eApp){
          app = eApp;
          // operate on app 
      } 
      

      【讨论】:

        猜你喜欢
        • 2015-02-27
        • 2014-04-11
        • 1970-01-01
        • 1970-01-01
        • 2013-06-18
        • 1970-01-01
        • 2018-10-19
        • 1970-01-01
        • 2011-10-18
        相关资源
        最近更新 更多