module.exports不会导出具有函数

时间:2017-09-07 16:54:29

标签: javascript node.js unit-testing node-modules

我已经创建了一个ModulesManager来管理我的所有模块,所以我的“server.js”顶部没有大量的需求列表,但每次我尝试访问管理器的方法时,我的服务器崩溃并抛出一个错误,说我的经理方法不是一个函数。

TypeError: moduleManager.sqlString is not a function

我不确定我在这里做错了什么,这可能是一个愚蠢的错误,我试图在网上寻找答案,但是每个人都说不同的东西,没有任何作用。

Modules Manager(manager.js):

const sqlSetup = require("./sqlSetup.js");
const sqlSafeString = require("./sqlString.js");

function Manager(){
    this.sqlString = function(query){
        return sqlSafeString.getSqlSafeString(query);
    },
    this.sql = function(){
        return sqlSetup;
    }
}
module.exports = Manager;

模块SQL(sqlSetup.js):

const SqlString = require('sqlstring');

function getSqlSafeString(query){
    //format query to fit in MySQL
    var format = SqlString.escape(query);   
    return format;
}
module.exports = getSqlSafeString;

这是对我正在尝试制作的Travis构建的测试,模块管理器路径很好,问题实际上在“ModuleManager.js”中,我不明白......

require('dotenv').config();
const Discord = require("discord.js");
const client = new Discord.Client();
const token = process.env.MOISTY;
const moduleManager = require("../modules/manager.js");
const assert = require("assert");

console.log("MAKE SURE MOISTY IS OFFLINE!");

client.login(token);

client.on('ready', () => {
    //confirm login
    console.log("MOISTY:200");

    //Assert
    assert.deepEqual(moduleManager.sqlString("sample text"), "sample test");

    //terminate the session
    process.exit();
});

我不习惯模块导出,所以这可能是一个简单的问题......

3 个答案:

答案 0 :(得分:1)

您的代码中存在多个错误。

module.exports = getSqlSafeString;export设置为getSqlSafeString

执行require("./sqlString.js")后,您将获得分配给exports的值,因此在您的情况下为getSqlSafeString

因此,如果您想访问该功能,请写下:

const getSqlSafeString = require("./sqlString.js");
//...
return getSqlSafeString(query);` 

module.exports = Manager;导出函数Manager但不导出Manager类型的对象,因此moduleManager.sqlString将等于Manager.sqlString。如果你只想将函数分组在一个对象中,那么使用构造函数无论如何都没有多大意义,所以你应该这样写:

module.exports = {
    sqlString : function(query){
      return sqlSafeString.getSqlSafeString(query)
    },
    sql : function(){
      return sqlSetup
    }
};

如果你真的想在Manager类型的对象上创建,那么你需要写:

module.exports = new Manager

答案 1 :(得分:0)

为了能够从模块B的模块A require获得某些内容,您必须在模块A中导出该内容。导出它时将其分配给module.exports

Yout问题您没有在Manager模块中导出 Manager

您可以简单地导出Manager,但是,因为您似乎正在使用Manager的实例:

const moduleManager = require("../modules/manager.js");
...
moduleManager.sqlString("sample text")

然后您必须导出实例。添加到manager.js

module.exports = new Manager();

答案 2 :(得分:0)

您将函数放在实例上,即this.sqlStringsqlString实例上名为Manager的属性。但是你没有使用Manager作为构造函数,即没有使用new Manager()或在你的情况下使用new moduleManager()

您可以将导入代码更改为以下内容

const moduleManager = new require("../modules/manager.js")();

或将导出更改为:

module.exports = new Manager();

然后moduleManager将成为Manager的一个实例,并且可以使用moduleManager.sqlString