module.exports 不会导出带函数的对象

module.exports won't export object with function

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

TypeError: moduleManager.sqlString is not a function

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

模块管理器(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();
});

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

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

你的问题是你没有导出管理器模块的Manager

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

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

那你必须导出一个实例。添加到 manager.js:

module.exports = new Manager();

您的代码中有多个错误。

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

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

您可以将导入代码更改为如下所示

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

或将导出更改为:

module.exports = new Manager();

那么moduleManager将是Manager的一个实例,并且能够使用moduleManager.sqlString