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”