Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何预防;无法读取未定义的属性示例";当试图检查所述属性是否未定义时_Javascript_Node.js_Discord.js - Fatal编程技术网

Javascript 如何预防;无法读取未定义的属性示例";当试图检查所述属性是否未定义时

Javascript 如何预防;无法读取未定义的属性示例";当试图检查所述属性是否未定义时,javascript,node.js,discord.js,Javascript,Node.js,Discord.js,我正在node.js上编写一个简单的Discord bot,其中Discord.js使用JSON作为数据库(我知道我可能不应该使用JSON作为数据库,但我现在不想设置实际的数据库),它只有一个命令,“!click”。当您在公会中执行“!click”时,它将检查您的discord id是否在数据库中有任何点击,如果您没有任何点击,则您的点击值设置为1,如果您有,则您的点击数+=1。我遇到的问题是,检查用户是否单击了未定义的。使用if(data[personid].clicks==undefined

我正在node.js上编写一个简单的Discord bot,其中Discord.js使用JSON作为数据库(我知道我可能不应该使用JSON作为数据库,但我现在不想设置实际的数据库),它只有一个命令,“!click”。当您在公会中执行“!click”时,它将检查您的discord id是否在数据库中有任何点击,如果您没有任何点击,则您的点击值设置为1,如果您有,则您的点击数+=1。我遇到的问题是,检查用户是否单击了
未定义的
。使用
if(data[personid].clicks==undefined)进行检查时
我得到
TypeError:无法读取未定义的属性“MyDiscordId”
。我能做些什么来解决这个问题?这是我的全部代码:

const Discord=require('Discord.js');
var fs=要求(“fs”);
const client=new Discord.client();
client.on('ready',()=>{
log(`Logged as${client.user.tag}!`);
});
client.on('message',msg=>{
如果(!msg.guild)返回;
如果(msg.content=='!单击“”){
msg.reply(“您的点击现在是”+clickeridoo(msg.author.id))
}
});
功能点击器(idd){
var json=“”
var数据;
var playerid=idd.toString();
fs.readFile(“data.json”,函数(err,data){
json=json.stringify(数据);
data=JSON.parse(JSON);
})
如果(数据[playerid]。单击===未定义){
数据[playerid]。单击次数=1;
}否则{
如果(数据[playerid]。单击!==未定义){
数据[playerid]。单击+=1;
}
}
fs.writeFile(“data.json”,data)
返回数据[playerid]。单击.toString()
}
client.login('token');

如果您知道您有一个对象,
obj
,该对象已定义,但属性未定义,则
obj.prop===undefined
是一个不会引发错误的有效测试。如果您不确定对象是否已定义,则必须执行以下操作:
typeof obj===“undefined”
。如果您所讨论的变量是一个参数或已声明但未定义,如
let test您也可以只测试
测试===未定义的
。如果所讨论的变量从未定义过,那么您应该像
typeof test===“undefined”
那样执行。雅各布的回答看起来确实解决了你的问题。当然,无论如何,这对你来说都是很好的学习,所以我就不说了。

你的问题不在于
点击
是未定义的;这是因为您的
数据
变量未定义。请查看此代码段:

var data;
var playerid = idd.toString();
fs.readFile("data.json", function(err, data){
  json = JSON.stringify(data);
  data = JSON.parse(json);
})
if(data[playerid].clicks === undefined){ // <-- BOOM

由于
数据
未定义,因此似乎引发了错误。所以你也应该检查一下。比如:

const clickedDefined = data && data[playerid] && data[playerid].clicks;

您还可以在此处查看null propagation操作符和执行这些检查的其他方法:

null propagation操作符是否有效?…创建一个方法,读取传入playerid的数据变量并在其中执行检查异步编程是异步的
const clickedDefined = data && data[playerid] && data[playerid].clicks;