(错误)从服务器 returns 未定义获取对象
(Bug) fetched object from server returns undefined
这个过程涉及到很多代码,所以我将解释尽可能缩小问题范围的最佳方法。首先,用户注册并将带有其他嵌套对象和数组的对象发送到中间件。中间件...
app.post('/api/passData', (req, res) =>
{
const {data} = req.body;
console.log(`passData returned: ${data.members[0]}`);
dataPool.setData({data});
res.json(`${data} block was added`);
});
控制台记录“返回的 passData:[object Object]”
然后将其处理成一个“块”以添加到块链中,其中包含一个包含对象的数组 属性 命名数据,在该对象的更深处最终包含 eccrypto https://github.com/bitchan/eccrypto public键。我需要访问 public 键,但它一直返回未定义(public 键几乎肯定不是问题,而是上下文)。
登录后,用户获取区块链,代码根据表单输入缩小所需数据的范围(表单 + 处理表单代码可能不相关)。
我设置了一个等于 chain[i].data[0].members[0].user 的字段的变量,它是通过从服务器获取区块链而派生的(链是其索引中具有不同块的区块链,在处理完目标块后,它将使用一个对象访问其数据数组,该对象具有“名称”键和一个成员数组,它将所有用户对象存储在其索引中。)
登录后端的缩小问题:
let tester = await decryptMes(chain[i].data[0].members[0].user);
//user public key is passed to data in decryptMes() parameters.
window.decryptMes = async function(data)
{
var skey = getSKey();
if (skey === null || undefined)
{
console.log('You do not have a key pair');
return;
}
console.log("skey is not null");
console.log(`data returned ${data}`); //data is returning undefined!
var decryptedMes = await eccrypto.decrypt(skey, data);
var deMes = decryptedMes.toString();
console.log(deMes);
return deMes;
}
并且在 decryptmes 函数中,第 11 行的调试字符串 returns“返回的数据未定义”
重要控制台消息:
data returned undefined
genKey.js:33886 Uncaught (in promise) TypeError: Cannot read property 'ephemPublicKey' of undefined
at Object.exports.decrypt (genKey.js:33886)
at window.decryptMes (genKey.js:26722)
at window.search (Login.js:68)
备注:
当我在邮递员上获取区块链时,它显示“成员”数组中有一个对象,当我尝试在 encryptMes 函数或登录函数的任何范围内将其打印到控制台时,它如何显示在邮递员上但未定义?
邮递员显示:
{
"timestamp": 1612469806548,
"lastHash": "0e01a641613ffa5518a8998267d07057cfd77eb60e99bb2b803e2e96ec118f86",
"hash": "021472c81fe604e052ae108dd10fd9204daa0dcb7dc8f7ba33648e0deb48e2af",
"data": [
{
"name": "LifeNet",
"members": [
{
"0": {
"user": "[object Object]",
"profilePic": null,
"enDOB": "[object Object]",
"listeners": [],
"listening": [],
"friends": {},
"requested": [],
"blocked": [],
"channel": false
}
}
]
}
],
"nonce": 3,
"difficulty": 3,
"type": "pass Value here"
}
如您所见,在索引 0 中有第一个索引为 0 的成员对象,其对象字段的用户 不是未定义的。
结论:
对于未定义的对象,我做错了什么?我希望我能够有效地展示相关内容,并且非常感谢任何帮助,因为我在 JavaScript 中有很多东西要学习。谢谢
下面可以查看登录客户端后台,如果需要
登录后端:
window.decryptMes = async function(data)
{
var skey = getSKey();
if (skey === null || undefined)
{
console.log('You do not have a key pair');
return;
}
console.log("skey is not null");
console.log(`data returned ${data}`); //data is returning undefined!
var decryptedMes = await eccrypto.decrypt(skey, data);
var deMes = decryptedMes.toString();
console.log(deMes);
return deMes;
}
window.getData = async function()
{
var response = await fetch("https://goldengates.club:3000/api/blocks");
var chain = await response.json();
return chain;
}
window.login = async function(inputs)
{
const chain = await getData(); //might need to parse this
search(inputs,chain);
console.log(chain);
}
window.search = async function(inputs,chain)
{
console.log("search: entered");
var username = inputs.user.value;
var enUser = await encryptMes(username);
console.log(enUser);
console.log(username);
var user;
var uData;
console.log("block loop: pre"); //stopping here?
for(let i = chain.length-1; i> 0; i--) //genesis block minus 1 is not greater than 0
{
console.log("block loop: start");
if('name' in chain[i].data[0])
{
console.log("name: looped");
if(chain[i].data[0].name == `LifeNet`) //works
{
console.log(`${chain[i].data[0].name}`);
console.log("name: entered");
//below, what is being decrypted is undefined
let tester = await decryptMes(chain[i].data[0].members[0].user);
if(username == tester) //username instea of enUser .members[enUser]
{
console.log("user: looped");
user = chain[i].data[0].members[enUser];
//separate the keys and decrypt them here.
var pfp = user.profilePic;
var dob = user.enDOB;
var lers = user.listeners;
var ling = user.listening;
var fnds = user.friends;
var req = user.requested;
var bck = user.blocked;
var cnl = user.channel;
var uData =
{
username,
pfp,
dob,
lers,
ling,
fnds,
req,
bck,
cnl
}
localStorage.setItem('UD',JSON.stringify(uData));
//window.location.href = "home.html";
//redirect to home page with above data
console.log(uData + "search: exited t");
return uData;
}
}
}
}
alert(`${username} is not registered`);
console.log(username);
console.log("search: exited f");
return false;
}
基于访问用户的问题中的对象应该使用 members[0][0]
所以只需尝试
chain[i].data[0].members[0][0].user
如果我没理解错的话,服务器returns一个JSONobject也就是你所说的chain
。如果是这种情况,则您将对象视为数组。它在某种程度上确实有效,但它返回对象的第一个 属性 。那是因为在 javascript 中,对象的行为几乎类似于 PHP 中的关联数组。
此外,正如 Mohammad Yaser Ahmadi 指出的那样,members
属性 是一个包含对象的数组,该对象的属性由数字命名。
尝试将 chain[i].data[0].members[0].user
更改为 chain.data[0].members[0][0].user
。
Just a tip: when logging data to the console, use JSON.stringify(). for example, console.log(JSON.stringify(chain, null, 2))
. it makes life a bit easier when debugging.
这个过程涉及到很多代码,所以我将解释尽可能缩小问题范围的最佳方法。首先,用户注册并将带有其他嵌套对象和数组的对象发送到中间件。中间件...
app.post('/api/passData', (req, res) =>
{
const {data} = req.body;
console.log(`passData returned: ${data.members[0]}`);
dataPool.setData({data});
res.json(`${data} block was added`);
});
控制台记录“返回的 passData:[object Object]”
然后将其处理成一个“块”以添加到块链中,其中包含一个包含对象的数组 属性 命名数据,在该对象的更深处最终包含 eccrypto https://github.com/bitchan/eccrypto public键。我需要访问 public 键,但它一直返回未定义(public 键几乎肯定不是问题,而是上下文)。
登录后,用户获取区块链,代码根据表单输入缩小所需数据的范围(表单 + 处理表单代码可能不相关)。
我设置了一个等于 chain[i].data[0].members[0].user 的字段的变量,它是通过从服务器获取区块链而派生的(链是其索引中具有不同块的区块链,在处理完目标块后,它将使用一个对象访问其数据数组,该对象具有“名称”键和一个成员数组,它将所有用户对象存储在其索引中。)
登录后端的缩小问题:
let tester = await decryptMes(chain[i].data[0].members[0].user);
//user public key is passed to data in decryptMes() parameters.
window.decryptMes = async function(data)
{
var skey = getSKey();
if (skey === null || undefined)
{
console.log('You do not have a key pair');
return;
}
console.log("skey is not null");
console.log(`data returned ${data}`); //data is returning undefined!
var decryptedMes = await eccrypto.decrypt(skey, data);
var deMes = decryptedMes.toString();
console.log(deMes);
return deMes;
}
并且在 decryptmes 函数中,第 11 行的调试字符串 returns“返回的数据未定义”
重要控制台消息:
data returned undefined
genKey.js:33886 Uncaught (in promise) TypeError: Cannot read property 'ephemPublicKey' of undefined
at Object.exports.decrypt (genKey.js:33886)
at window.decryptMes (genKey.js:26722)
at window.search (Login.js:68)
备注: 当我在邮递员上获取区块链时,它显示“成员”数组中有一个对象,当我尝试在 encryptMes 函数或登录函数的任何范围内将其打印到控制台时,它如何显示在邮递员上但未定义?
邮递员显示:
{
"timestamp": 1612469806548,
"lastHash": "0e01a641613ffa5518a8998267d07057cfd77eb60e99bb2b803e2e96ec118f86",
"hash": "021472c81fe604e052ae108dd10fd9204daa0dcb7dc8f7ba33648e0deb48e2af",
"data": [
{
"name": "LifeNet",
"members": [
{
"0": {
"user": "[object Object]",
"profilePic": null,
"enDOB": "[object Object]",
"listeners": [],
"listening": [],
"friends": {},
"requested": [],
"blocked": [],
"channel": false
}
}
]
}
],
"nonce": 3,
"difficulty": 3,
"type": "pass Value here"
}
如您所见,在索引 0 中有第一个索引为 0 的成员对象,其对象字段的用户 不是未定义的。
结论: 对于未定义的对象,我做错了什么?我希望我能够有效地展示相关内容,并且非常感谢任何帮助,因为我在 JavaScript 中有很多东西要学习。谢谢
下面可以查看登录客户端后台,如果需要
登录后端:
window.decryptMes = async function(data)
{
var skey = getSKey();
if (skey === null || undefined)
{
console.log('You do not have a key pair');
return;
}
console.log("skey is not null");
console.log(`data returned ${data}`); //data is returning undefined!
var decryptedMes = await eccrypto.decrypt(skey, data);
var deMes = decryptedMes.toString();
console.log(deMes);
return deMes;
}
window.getData = async function()
{
var response = await fetch("https://goldengates.club:3000/api/blocks");
var chain = await response.json();
return chain;
}
window.login = async function(inputs)
{
const chain = await getData(); //might need to parse this
search(inputs,chain);
console.log(chain);
}
window.search = async function(inputs,chain)
{
console.log("search: entered");
var username = inputs.user.value;
var enUser = await encryptMes(username);
console.log(enUser);
console.log(username);
var user;
var uData;
console.log("block loop: pre"); //stopping here?
for(let i = chain.length-1; i> 0; i--) //genesis block minus 1 is not greater than 0
{
console.log("block loop: start");
if('name' in chain[i].data[0])
{
console.log("name: looped");
if(chain[i].data[0].name == `LifeNet`) //works
{
console.log(`${chain[i].data[0].name}`);
console.log("name: entered");
//below, what is being decrypted is undefined
let tester = await decryptMes(chain[i].data[0].members[0].user);
if(username == tester) //username instea of enUser .members[enUser]
{
console.log("user: looped");
user = chain[i].data[0].members[enUser];
//separate the keys and decrypt them here.
var pfp = user.profilePic;
var dob = user.enDOB;
var lers = user.listeners;
var ling = user.listening;
var fnds = user.friends;
var req = user.requested;
var bck = user.blocked;
var cnl = user.channel;
var uData =
{
username,
pfp,
dob,
lers,
ling,
fnds,
req,
bck,
cnl
}
localStorage.setItem('UD',JSON.stringify(uData));
//window.location.href = "home.html";
//redirect to home page with above data
console.log(uData + "search: exited t");
return uData;
}
}
}
}
alert(`${username} is not registered`);
console.log(username);
console.log("search: exited f");
return false;
}
基于访问用户的问题中的对象应该使用 members[0][0]
所以只需尝试
chain[i].data[0].members[0][0].user
如果我没理解错的话,服务器returns一个JSONobject也就是你所说的chain
。如果是这种情况,则您将对象视为数组。它在某种程度上确实有效,但它返回对象的第一个 属性 。那是因为在 javascript 中,对象的行为几乎类似于 PHP 中的关联数组。
此外,正如 Mohammad Yaser Ahmadi 指出的那样,members
属性 是一个包含对象的数组,该对象的属性由数字命名。
尝试将 chain[i].data[0].members[0].user
更改为 chain.data[0].members[0][0].user
。
Just a tip: when logging data to the console, use JSON.stringify(). for example,
console.log(JSON.stringify(chain, null, 2))
. it makes life a bit easier when debugging.