首页 > 解决方案 > X 不是函数 - 如何修复

问题描述

我正在使用它创建 TS3 Query Bot

我想出了 core.js、register.js 和 2 个在这里不重要的配置。

核心.js:

const TeamSpeak3 = require("ts3-nodejs-library")
var config = require("./configs/config.js")

//Create a new Connection
const ts3 = new TeamSpeak3({
    host: "localhost",
    queryport: 10011,
    serverport: 9987,
    username: "serveradmin",
    password: "",
    nickname: "NodeJS Query Framework"
})

/*
  Ready gets fired when the Bot has connected to the TeamSpeak Query and
  issued login commands (if username and password has been given)
  selected the appropriate Server (also if given in the config)
  and set the nickname
*/
ts3.on("ready", async () => {
    Promise.all([
        ts3.registerEvent("server"),
        ts3.registerEvent("channel", 0),
        ts3.registerEvent("textserver"),
        ts3.registerEvent("textchannel"),
        ts3.registerEvent("textprivate")
    ]).then(() => {
        console.log("[ JANbot ] Nasluchuje eventow: server, channel (0), textserver, textchannel, textprivate")
    }).catch(e => {
        console.log("Catched an error!")
        console.error(e)
    })
})

if(config.registerEnabled = true) {
    var register = require("./inc/functions/register.js")
    ts3.on("clientmoved", event => {
            register.registerUser(event, event.client)
    })
}

ts3.on("error", e => console.log("Error", e.message))
ts3.on("close", e => console.log("Connection has been closed!", e))

注册.js:

module.exports = function() {
    this.registerUser = function(event, client) 
    {
        var register_config = require("/home/node_modules/bot/configs/register_config.js")
        if(event.channel.cid == register_config.channelId) {
            if(! client.servergroups.includes(register_config.groupId)) {
                event.client.addGroups(config.groupId)
                event.client.message("You have been successfully registered!")
                event.client.kickFromChannel()
                return console.log("zarejestrowano " + event.client.nickname)
            } else {
                event.client.message("You are already registred!")
                event.client.kickFromChannel()
                return console.log(event.client.nickname + " juz jest zarejestrowany")
            }
        }
    };
}

主要思想是处理 bot 及其在 core.js 中的连接,并且只需要特定的功能以使其更容易更新(您不需要下载具有许多功能的整个 core.js,只需一个文件,最终为其配置)

我得到的错误:

Error register.registerUser is not a function

我在 JS 方面不是很先进,所以如果我做错了什么,除了我的问题,请告诉我。我有一些小想法,出了什么问题,但我无法解决。我认为 registerUser 没有功能,但我不知道如何在此处实现 register.js:

if(config.registerEnabled = true) {
    var register = require("./inc/functions/register.js")
    ts3.on("clientmoved", event => {
            register.registerUser(event, event.client)
    })
}

顺便提一句。我添加返回只是因为我认为它会将 registerUser 更改为函数。1

//编辑:它有效,但现在我遇到了第二个问题。现在代码:

module.exports = {
    registerUser: function(event, client) 
    {
        var register_config = require("/home/node_modules/bot/configs/register_config.js")
        if(event.channel.cid == register_config.channelId) {
            var grupa = register_config.groupId
            if(!event.client.servergroups.includes(register_config.groupId)) {
                var date = new Date(),
                    g = date.getHours(),
                    m = date.getMinutes(),
                    s = date.getSeconds()
                event.client.addGroups(register_config.groupId)
                event.client.poke("You have been successfully registered!")
                event.client.kickFromChannel()
                console.log(" [ " + g + " : " + m + " : " + s + " ] " +'Zarejestronwalem: ' + client.nickname)
            } else {
                event.client.poke("You are already registered!")
                event.client.kickFromChannel()
            }
        }
    }
}

那个部分:

if(!event.client.servergroups.includes(register_config.groupId)) {

总是正确的,因为客户端的数组服务器组中没有数字 11,所以脚本只是认为它是正确的。我添加了 console.log(event.client.servergroups) 以查看是否是 register_config.groupId 或其他问题,这会显示在控制台中:

[9、11]

所以在那之后我发现它是 register_config.groupId 的问题,因为机器人的代码如下:(core.js 与出现第二个问题之前的相同)

注册.js:

module.exports = {
    registerUser: function(event, client) 
    {
        var register_config = require("/home/node_modules/bot/configs/register_config.js")
        if(event.channel.cid == register_config.channelId) {
            var grupa = register_config.groupId
            if(!event.client.servergroups.includes(register_config.groupId)) {
                var date = new Date(),
                    g = date.getHours(),
                    m = date.getMinutes(),
                    s = date.getSeconds()
                event.client.addGroups(register_config.groupId)
                event.client.poke("You have been successfully registered!")
                event.client.kickFromChannel()
                console.log(" [ " + g + " : " + m + " : " + s + " ] " +'Zarejestronwalem: ' + client.nickname)
            } else {
                event.client.poke("You are already registered!")
                event.client.kickFromChannel()
            }
        }
    }
}

register_config.js:

module.exports = {
        channelId: 4,
        groupdId: 11
}

Bot 的行为如下:

随机频道上的客户端(不使用 cid 4)客户端使用 cid 4 加入频道 机器人踢他,戳他,不给他服务器组

结论: register_config.groupId 不知何故没有被定义为第十一个。

//编辑#2:

我已经这样做了:

var register_config = {

        "groupId": 11,
        "channelId": 4

};

module.exports = register_config;

它有效:) 没关系,谢谢你的帮助!

标签: javascriptnode.js

解决方案


register.js中导出一个对象而不是一个函数:

// module.exports = function() {
module.exports = {
    // this.registerUser = function(event, client) 
    registerUser: function(event, client) 
    {
        var register_config = require("/home/node_modules/bot/configs/register_config.js")
        if(event.channel.cid == register_config.channelId) {
            if(! client.servergroups.includes(register_config.groupId)) {
                event.client.addGroups(config.groupId)
                event.client.message("You have been successfully registered!")
                event.client.kickFromChannel()
                return console.log("zarejestrowano " + event.client.nickname)
            } else {
                event.client.message("You are already registred!")
                event.client.kickFromChannel()
                return console.log(event.client.nickname + " juz jest zarejestrowany")
            }
        }
    };
}

推荐阅读