开发节点模块

时间:2018-03-21 14:29:14

标签: node.js node-modules

我正在开发自己的节点模块,将其放在npm网站上。此节点模块与数据库有一些交互。我需要从用户(dbName,server,port)接收三个值,并在我的模块中设置它们,以便我可以连接到数据库。我想到的第一件事就是: 要求用户打开配置文件并更改代码(将值分配给三个变量):

var dbConf = {
    server: '',
    port: 0,
    dbName: ''
};

但我认为这种做法完全错了。我试图创建一个函数,并要求用户首先使用三个参数(dbName,server,port)调用该函数,该函数为我工作。然后用户首先需要我的模块,然后调用该函数,最后使用模块:

var myModule = require('myModule');
myModule.config('TestDB', 'localhost', 27017);
myModule.someMethod()...

但我不知道如何编写我的index.js文件来完成这项工作!我写了这样的东西:(index.js)

var config = function(dbName, server, port ) {
    var dbConf = {
        server: '',
        port: 0,
        dbName: ''
    };
    dbConf.server  = server;
    dbConf.port = port;
    dbConf.dbName = dbName ;
    return 'mongodb://' + dbConf.server + ':' + dbConf.port + '/' + 
    dbConf.dbName;
}

//connect to mongoDB local server
mongoose.connect(config);

module.exports = {
    config: config,
    mongoose: mongoose
}; 

但它没有用。我怎么能做这个工作?

更新: index.js:

function gridFS(dbName, server, port) {
    var dbUrl = 'mongodb://' + server + ':' + port + '/' + dbName;
    this.mongoose = mongoose.connect(dbUrl);
    this.db = mongoose.connection;
    this.gfs = gridfsLockingStream(this.mongoose.connection.db, 
    this.mongoose.mongo);


    //if the connection goes through
    this.db.on('open', function (err) {
        if (err) throw err;
        console.log("connected correctly to the server");
    });


    this.db.on('error', console.error.bind(console, 'connection error:'));

}
gridFS.prototype.putFile = function putFile(...) {};
gridFS.prototype.getFileById = function getFileById(id, callback) {
    this.putFile(); //here is the problem
}
module.exports = gridFS;

2 个答案:

答案 0 :(得分:1)

在你的module.js文件中

let alertMethod = (message) => {
    console.log(message);
}

let myModule = (database, server, port) => {

    return {
        alert: alertMethod
    }
}

module.exports = myModule;

app.js文件

let myModule = require('./module');

const _module = myModule('database', 'server', 'port');

_module.alert('YO!');

答案 1 :(得分:0)

取决于您对此myModule.someMethod的所有权。如果您发布Minimal, Complete, and Verifiable example,则会更容易。

尽管如此,您的代码有一些容易发现的问题:

首先,mongoose.connect需要一个String参数,因为您可以看到here,但您传递的是function。您的config会返回String,是的,但是function(您需要调用它才能获得String)。

这给我们带来了第二个问题,当你像你一样打电话给mongoose.connect时,在你第一次导入模块之前会立即调用它,然后才能调用myModule.config并通过你的用于创建连接字符串的参数。

如何做到这一点的一个例子是像这样组织你的模块:

var config = function(dbName, server, port ) {
    this.connectionString = 'mongodb://' + server + ':' + port + '/' + dbName;
}

var connect = function() {
    mongoose.connect(this.connectionString);
}

module.exports = {
    config: config,
    connect: connect
}

然后你会像这样使用它

var myModule = require('./index.js')
myModule.config('TestDB', 'localhost', 27017);
myModule.connect();

此示例还应该让您了解其他方法(如myModule.someMethod)的外观。