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
我创建了一个 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