2016-09-23 33 views
0

我想创建一个使用ORM Bookshelf.js的库(如果你愿意的话,基本上是一个封装在Bookshelf.js的顶部)。现在Bookshelf.js要求您运行驱动程序安装,以便能够连接到项目根目录中的正确数据库(例如:npm install mysql)。如何将库传递给节点中较低的依赖项?

由于Bookshelf实例在其node_modules文件夹中没有mysql依赖项,因此我自己的库也需要这样做,因为Bookshelf.js需要它,但它一直说Error: Cannot find module 'mysql',这是正常的。

如果我打出来的结构,它是这样的:

* New Project 
** mysql 
** LibThatUsesBookshelf 
**** Bookshelf 

现在Bookshelf.js可能需要这样的结构:

* New Project 
** LibThatUsesBookshelf 
**** mysql 
**** Bookshelf 

有没有办法,我能仍然获得方式显示第一个结构的书架?

P.S.我知道这个解释可能会让人困惑,但这是一个很难的问题,我没有别的办法解释它。

回答

0

让你的模块通的客户端的实例书架:

// mysuperfancymodule.js 
module.exports = function(bookshelf) { 
    // do fancy things with the bookshelf instance 
} 
在您的客户端应用程序

然后:

// some app code: 
var mySuperFancyModule = require('mysuperfancymodule'); // assuming it is published to npm 
var knex = require('knex')({ 
    // init knex... 
}); 
var bookshelf = require('bookshelf')(knex); 

mySuperFancyModule(bookshelf); // init my super fancy module 
+0

谢谢您的建议!我目前正在这样做,但我想避免用户能够使用这个额外的依赖项。关于插件注册和其他一些问题也有更多问题,这使我很难继续这样做。有没有其他办法可以解决这个问题? –

+0

这可能是个人品味,但我不明白为什么这会是一个缺点。它可以让用户在使用模块之前自定义'knex'和'bookshelf'。这也使得你的模块的用户明显依赖它。 – forrert

+0

好的,在考虑这个解决方案之后,我会回到传递bookshelf实例。感谢您的帮助! :)我将这个答案标记为正确的,因为它是最干净的一个,不需要将路径注入到module.paths变量中。 –

相关问题