node.js/discord.js:TypeError:无法读取 null 的属性“setPresence”

Posted

技术标签:

【中文标题】node.js/discord.js:TypeError:无法读取 null 的属性“setPresence”【英文标题】:node.js/discord.js: TypeError: Cannot read property 'setPresence' of null 【发布时间】:2020-02-16 22:19:19 【问题描述】:

尝试一个简单的测试,但我从这一行得到一个错误: client.user.setPresence('game', type: 'PLAYING' );

VSCode 的日志:

C:\Users\dvmvged\Documents\mao>node . whoa.js
C:\Users\dvmvged\Documents\mao\whoa.js:9
client.user.setPresence('game',  type: 'PLAYING' );
            ^

TypeError: Cannot read property 'setPresence' of null
    at Object.<anonymous> (C:\Users\dvmvged\Documents\mao\whoa.js:9:13)
←[90m    at Module._compile (internal/modules/cjs/loader.js:956:30)←[39m
←[90m    at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)←[39m
←[90m    at Module.load (internal/modules/cjs/loader.js:812:32)←[39m
←[90m    at Function.Module._load (internal/modules/cjs/loader.js:724:14)←[39m
←[90m    at Function.Module.runMain (internal/modules/cjs/loader.js:1025:10)←[39m
←[90m    at internal/main/run_main_module.js:17:11←[39m

whoa.js

    const Discord = require('discord.js');
    const client = new Discord.Client();

    client.on('ready', () => 
        console.log("Logged in.");
        client.login("token");
    );

    client.user.setPresence('test',  type: 'PLAYING' );

package.json:

 
    "name":"test-bot",
    "version":"1.0.0",
    "description":"simple test",
    "main":"whoa.js",
    "dependencies": 
        "discord.js":"^11.5.1"
    ,
    "devDependencies": 

    ,
    "scripts": 
        "test":"echo \"Error: no test specified\" && exit 1"
    ,
    "author":"no one",
    "license":"ISC"

NPM 版本:6.11.3

Node.js 版本:12.12.0

Discord.js 版本:11.5.1

编辑: 只是为了让您知道,我尝试了 .setActivity 和 .setGame。同样的错误。

【问题讨论】:

我假设您将实际令牌传递给 .login() 而不是 "token" @c_sagan 不,我只是想隐藏我的令牌 尝试将.login() 移到.on() 范围之外。见docs 还要注意.login()返回一个promise,所以当你调用.setPresence()时,你还没有收到来自.login()调用的响应。试试.login().then(client.user.setPresence()) 同样的错误,我尝试了你让我做的一切 【参考方案1】:

我认为这里发生的事情是 Node.js 事件循环的结果。您调用异步函数.login(),并在.login() 的响应到达之前立即尝试client.user.setPresence()

试试

  .login("token")
  .then(client.user.setPresence("game",  type: "PLAYING" ));

见Node Event Loop

【讨论】:

试过了,同样的错误。 client.login("令牌"); client.user.setPresence('game', type: 'PLAYING' ); TypeError:无法读取 null 的属性“setPresence”【参考方案2】:

.user 在您呼叫他时尚未填充。我将在这里注释事情发生的顺序。

const Discord = require('discord.js');
const client = new Discord.Client();

// #1
client.on('ready', () => 
    // #3
    console.log("Logged in.");
    client.login("token");
);

// #2
client.user.setPresence('test',  type: 'PLAYING' );

您只有在客户端准备好后才能保证 .user 存在。

每当您在节点中(不仅仅是在节点中!)中使用 回调 时,您都会将函数作为参数传递给某些东西。

该回调可能是计划该函数在以后运行。在这种特定情况下,它安排具有console.log 的函数在客户端“准备就绪”的未来事件上运行。

【讨论】:

这行得通。但它没有向控制台输出任何内容。另外,我想稍后在代码中更改机器人的状态。我以后可以使用相同的 .setPresence 函数吗? 所以我实际上从未制作过不和谐的机器人。从快速查看文档看来,您应该在外部调用“登录”(而不是在就绪回调中)。当客户端成功进行身份验证时,它应该发出“就绪”事件。 没错,您应该在就绪事件的回调之外登录(使用您的机器人令牌)。成功登录后,ready 事件将触发,并且您提供的回调函数中的内容将运行。此时,client.user 不应再为null,您将能够使用.setPresence() 之类的方法。基本上,将您的方法放在 ready 事件的回调中,您可以将 .login() 放在 js 文件的开头或结尾,没关系(只是不在尚未运行的回调中,显然它不应该在定义 client 之前)。

以上是关于node.js/discord.js:TypeError:无法读取 null 的属性“setPresence”的主要内容,如果未能解决你的问题,请参考以下文章

从函数中导出数据 [mysql, node.js, discord.js]

我的消息在 node.js/discord.js 中重复了很多次

如何从 json 响应中连接来自不同对象数组的值? Node.js、Discord.js

Node.js、discord.js 和 MySQL - ER_NO_SUCH_TABLE:表 'NAME' 不存在

为啥我的 node.js discord.js 机器人不发送文件? (没有错误)(可以发送消息)

Node.js Discord.js UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“calculatedPosition”