我已经创建了一个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();
});
我不习惯模块导出,所以这可能是一个简单的问题......
答案 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.sqlString
是sqlString
实例上名为Manager
的属性。但是你没有使用Manager
作为构造函数,即没有使用new Manager()
或在你的情况下使用new moduleManager()
您可以将导入代码更改为以下内容
const moduleManager = new require("../modules/manager.js")();
或将导出更改为:
module.exports = new Manager();
然后moduleManager
将成为Manager
的一个实例,并且可以使用moduleManager.sqlString