0

我正在从头开始在 Node.js 中构建一个 Web 服务器(没有快递,没有猫鼬)。我的代码(非常简化)看起来像这样:

var app = {};

app.config = require('./config');
app.http = require('http');
app.router = require('./router');
app.mongoDb = require('mongodb');
app.mongoClient = app.mongoDb.MongoClient;
app.mongoClient.connect(
        'mongodb://'
        + app.config.db.server + ':'
        + app.config.db.port + '/'
        + app.config.db.catalog, function(err, db) {
if (!err) {
        app.db = db;
        app.httpServer = app.http.createServer();
        app.httpServer.on('request', function(req, response) {
            req.app = app;
            req.response = response;
            req.value = {};
            app.router.main(req);
        });
        app.httpServer.listen(app.config.port);
    }
});

基本上,我在一个名为app. 我连接数据库并创建一个 http 服务器,然后我将其放入事件处理程序app的请求对象 ( ) 中。req我还将响应对象 ( response) 和空值对象 ( value) 放在req.

所以现在,如果我用 调用路由器函数app.router.main(req),我只需要传递req给它,我仍然可以访问所有全局内容以及请求、响应和与请求相关的任何其他值。它似乎工作正常。

我对这种方法的问题是:

  1. 当我需要它们时,是否有更简单的方法来获取我的所有对象?
  2. 物体在各处的传递req会对性能产生显着的不利影响吗?
  3. 这会导致与数据库连接、请求、响应或我的应用程序的任何其他部分相关的不可预见的问题吗?
4

3 回答 3

1
  1. 当我需要它们时,是否有更简单的方法来获取我的所有对象?

    将所有东西捆绑在一个对象下对我来说似乎不是最好的设计选择。当然,我可以接受这一点req,并且res几乎总是联系在一起,所以当然可以随意放置req.res = res,但是app

    此外,您app不应该真正改变;所以你不需要不断地传递它;一次就足够了。

    我会考虑将接受app上下文的导出添加到需要它们的程序模块中。

    var app;
    
    module.exports = {
        init: function (_app) {
            app = _app;
        },
    
        something: function (req) {
           // use req, you've got app if you need it.
        }
    }
    
  2. 到处传递 req 对象会对性能产生显着的不利影响吗?

    不,没什么严重的。您只是传递对对象的引用,而不是对象本身。如果您要跟踪reqs持久对象(例如app)上的所有内容,那么您将遇到与 JavaScript 等效的内存泄漏,但这不适用于此处。

  3. 这会导致与数据库连接、请求、响应或我的应用程序的任何其他部分相关的不可预见的问题吗?

    不是我能想到的。

    如果您经常需要传递上下文对象,我会仔细检查您的模块结构是否不佳,或者您的代码是否过度模块化。


FWIW,即使您没有使用 express 或 connect,查看他们的代码库并查看他们如何解决问题也没有错;它们都是开源的(https://github.com/visionmedia/expresshttps://github.com/senchalabs/connect

于 2013-02-20T15:45:33.283 回答
0

更简单的方法是只使用一个框架。否则,整个模块的构造函数/初始化程序。或者只是将大部分内容放在一个文件中,因为模块并不适合这种事情。

顺便说一下,整个模块的初始化程序示例如下:

app.router = require('./router').create(app);
var app;

module.exports.create = function(_app) {
    app = _app;
    return module.exports;
};

不,与其他任何事情相比,传递它不会对性能产生任何明显影响。

于 2013-02-20T15:47:02.673 回答
0

嗯,我几乎总是在我需要的时候需要某种 singelton,可以说你得到了:

应用程序.js

module.exports = exports = {
    start: function(config) {
         this.database = new database(config.database);
         this.webserver= http.createServer();
    }
 }

现在你必须设置你的路线说,如果你需要你的数据库对象,也许他们每个人都有自己的文件,例如你可以做的。

var db = require('app.js').database;

恕我直言,这很好用,让您可以在任何需要的地方访问重要的东西:)

于 2013-02-20T15:57:59.767 回答