【问题标题】:developing a node module开发节点模块
【发布时间】:2018-03-21 14:29:14
【问题描述】:

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

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

但我认为这种做法是完全错误的。我尝试创建一个函数并要求用户首先使用三个参数(dbName、服务器、端口)调用该函数,该函数为我完成了工作。然后用户首先需要我的模块,然后调用函数,最后使用模块:

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;

【问题讨论】:

    标签: node.js node-modules


    【解决方案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!');
    

    【讨论】:

    • 但是如何导出我的方法?
    • 好的。我已经用更详细的信息更新了我的答案。有很多模块模式,这就是其中之一。您可以通过简单的谷歌搜索查看其他模式。
    【解决方案2】:

    取决于你想用你的这个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)的外观。

    【讨论】:

    • 谢谢。现在我有一个严重的问题。我的代码有点复杂。我也在使用异步,gridfs-stream。我的方法也相互使用。不幸的是,当我在其他方法中使用 this.someMethod 时,出现此错误:TypeError: gridFS.somemthod is not a function。我知道这对你来说很不清楚。一般来说,我怎样才能在其他方法中使用方法而不会出现这个问题? (使用 this 会导致问题)
    • 我更新了问题并添加了一些代码。该代码与我的真实代码非常相似。我想在另一个函数中使用一个函数,最后导出我所有的函数。
    • @KasraGH 在您的“更新”index.js 中,您错误地使用了原型。解释它是一个更复杂的话题(至少在评论中解释),我会给你一个替代方案。创建所有方法(gridFSputFile...)并像我在示例中所做的那样导出它们(将它们创建为变量并将它们全部导出到一个对象中)。这样你就可以使用this相互调用它们。
    • @KasraGH 实际上...您正确使用原型,我的错。要出现此错误,您必须在导入时错误地使用它。尝试像 var gridFS = require('./index.js') 这样导入,然后创建 myModule 变量像 var myModule = new gridFS('TestDB', 'localhost', 27017)
    • 谢谢。我的问题解决了。我需要重构代码。我不应该要求用户向我提供服务器、端口等。相反,我只需要猫鼬。你能帮我解决这个问题吗:stackoverflow.com/questions/49428674/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    相关资源
    最近更新 更多