Ошибка типа: Не удается прочитать свойства null (чтение «статус») для автономных пользователей

#javascript #discord #bots #offline #status

#язык JavaScript #Discord #боты #Не в сети #Статус

Вопрос:

Я создал команду userinfo, которая отображает информацию о пользователе, такую как пользовательский статус, действия,…

У меня проблема, когда я набираю свою команду для любого автономного пользователя, консоль возвращает это сообщение :

 TypeError: Cannot read properties of null (reading 'status') at UserInfoCommand.exec (D:DeveloppementFuzeBotsrccommandsmiscuserinfo.js:26:46) at CommandHandler.runCommand (D:DeveloppementFuzeBotnode_modulesdiscord-akairosrcstructcommandsCommandHandler.js:1173:29) at CommandHandler.handleDirectCommand (D:DeveloppementFuzeBotnode_modulesdiscord-akairosrcstructcommandsCommandHandler.js:739:15) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async CommandHandler.handle (D:DeveloppementFuzeBotnode_modulesdiscord-akairosrcstructcommandsCommandHandler.js:541:11)  

Я использую фреймворк акайро и discord.js.

Вот userinfo.js :

 const { Command } = require('discord-akairo');  const { MessageEmbed } = require('discord.js');    class UserInfoCommand extends Command {  constructor() {  super('userinfo', {  aliases: ['userinfo', 'info'],  description: 'Affiche les informations de l'utilisateur',  userPermissions: 'ADMINISTRATOR',  clientPermissions: 'ADMINISTRATOR',  channel: 'guild',  args: [  {id: 'member', type: 'member', default: message =gt; message.member },  ]  });  }    exec(message, args) {    const getStatus = args.member.presence.status;  const activities= [];    for (const activity of args.member.presence.activities.values()) {  console.log(activity);  switch (activity.type) {  case 'PLAYING':  activities.push(`Joue à **${activity.name}**`);  break;  case 'LISTENING':  if (args.bot) activities.push(`Écoute **${activity.name}**`);  else activities.push(`Écoute **${activity.details}** de **${activity.state}**`);  break;  case 'WATCHING':  activities.push(`Regarde **${activity.name}**`);  break;  case 'STREAMING':  activities.push(`Stream **${activity.name}**`);  break;  case 'CUSTOM':  var customStatus = activity.state;  console.log(`------ ${customStatus} -------`);  if(customStatus === ''){  var customStatus = '*Aucun statut pour le moment*';  }  break;  }  }    switch (getStatus){  case 'online':  var status = "lt;:online:917793203523027024gt;";  break;  case 'idle':  var status = "lt;:idle:917793108354297886gt;";  break;  case 'offline':  var status = "lt;:offline:917793167691100242gt;";  break;  case 'dnd':  var status = "lt;:dnd:917793482620420106gt;";  break;  }    console.log(`------ ${activities.length} -------`);  const embed = new MessageEmbed()  .setColor("#FFD700")  .setTitle(`lt;:user:916747116259463228gt; **Informations sur l'utilisateur**`)  .setThumbnail(args.member.user.displayAvatarURL({ dynamic: true }))  .setDescription(`lt;@${args.member.id}gt; **(${args.member.user.tag})**`);  console.log(status);  if(status !== 'offline'){  if(activities.length gt; 0){  embed.addField('lt;:videogame:917781052003598366gt; Activité :', `${activities}`, true)  }else{  embed.addField('lt;:videogame:917781052003598366gt; Activité :', `*Aucune activité en cours*`, true)  }    if(!customStatus){  embed.addField(` ${status} Statut :`, `*Aucun statut*`, true)  }else{  embed.addField(`${status} Statut :`, `${customStatus}`, true)  }  }  return message.channel.send({embeds: });    }}module.exports = UserInfoCommand; 

Я не знаю, как это решить. Кстати, извините за мой плохой английский. Это происходит только тогда, когда пользователь находится в автономном режиме…

Комментарии:

1. Было бы лучше объявить status вне оператора switch и зарегистрировать его позже, чтобы посмотреть, что вы придумаете.

2. Я считаю, что проблема в строке const getStatus = args.member.presence.status; , но я не могу быть уверен, просто взглянув на приведенный выше код. Если вы уверены, что это происходит, когда пользователь находится в автономном режиме, изменение строки на const getStatus = args.member.presence.status || 'offline'; , вероятно, заставит ее работать, но это всего лишь обходной путь, и вам следует лучше выяснить, почему статус не передается функции exec

3. Спасибо за ваш ответ, но он все еще не работает.. Я пытался, но у меня та же ошибка. Похоже, что когда пользователь находится в автономном режиме, данные не отправляются …

Ответ №1:

 const getStatus = args.member?.presence?.status;  

это устранит ошибку, вызванную единственным экземпляром обращения к свойству «статус», когда оно не задано. Но тогда возникает вопрос, почему он не установлен?

Возможно, вам придется:

 const getStatus = args.member?.presence?.status ?? 'offline';  

но это предполагает, что у вас не будет доступа к одному и тому же объекту в другом месте графика, когда они находятся в автономном режиме. Итак, я бы добавил a console.log(args) в ваш случай с автономным переключателем, чтобы в этом случае вы могли искать альтернативное местоположение

Комментарии:

1. Спасибо за ваш ответ. К сожалению, это все еще не работает, кроме того, я не могу ничего регистрировать в консоли, потому что мой бот просто останавливается и показывает только ошибку ..

2. должен быть способ отладки ботов в вашей среде. 🙂 Я бы счел исследование этого более важным, чем что-либо другое. если вы получаете ту же ошибку , значит, вам не удалось обновить свой код или он не исходит из предоставленного вами кода. пожалуйста, убедитесь, что он выполняет ваш измененный код, и если да, то определите другой код, содержащий «x.y.статус».