2012-12-17 54 views
0

背景Node.js:模块继承的正确方法是什么?

我正在一个简单的web服务器上使用express.js顶部node.js。当我为我的服务器制作路由处理程序时,我不可避免地要分解出一些常见的功能。所以我想创建一个baseHandler,它具有所有常见处理函数(如数据库连接),并且在编写其他路由处理函数时,我想“扩展”baseHandler以方便地获取这些常用处理函数。

我试图

什么是实现它的方式,什么是这样做的正确方法?我正在尝试一个非常直接的解决方案,我将baseHandler作为普通处理程序模块编写,具有本地mysql实例并导出操纵数据库的函数。代码如下:

// Mysql 
var _mysql = require('mysql'); 

// Mysql connection 
exports.getDbHandle = function() { 
    var mysql = _mysql.createConnection({ 
    host: xxx 
    port: xxx 
    user: xxx 
    password: xxx 
    database: xxx 
}); 
return mysql; 
}; 

然后在我的路由处理程序,我只需要这个模块,并使用它的任何功能。这似乎解决了这个问题,但我有一种感觉,这是不正确的做法。因为我将在我的路由处理程序中拥有一个baseHandler模​​块实例,并且它感觉像是一个实用程序模块,而不是它自己的路由处理程序的一部分。

问题

那么什么是在延长的NodeJS模块的正确方法?

回答

3

将通用功能放入中间件中,您可以将其插入需要该功能的路由中,而不是创建类层次结构。这迫使您将功能彻底解耦合为独立的组件。中间件可以通过将这些数据库连接作为req请求对象的属性添加到路由中,从而使数据库连接可用。

+0

谢谢你的回答,但在阅读之后我还有更多的问题......我是Node.js的新手,所以我恐怕不能完全理解你的答案。您能否进一步解释我如何将中间件插入到路由中?我怎样才能将属性添加到请求对象?整个流程是什么? –

+1

@Xavier_Ex查看关于路由中间件主题的[此博客文章](https://blog.caurea.org/2011/11/05/express-route-middleware-chains.html)。它使用CoffeeScript示例代码,但即使您不熟悉该代码,您也应该能够获得它的要点。 – JohnnyHK

+0

谢谢,我会先读一下它。 –

相关问题