首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(Bug)从服务器获取对象返回未定义的

(Bug)从服务器获取对象返回未定义的
EN

Stack Overflow用户
提问于 2021-02-04 07:59:51
回答 2查看 621关注 0票数 0

在这个过程中涉及到很多代码,所以我将解释缩小问题范围的最佳方法。首先,用户注册并向中间件发送带有其他嵌套对象和数组的对象。中间件..。

代码语言:javascript
复制
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返回:对象对象“

然后将其处理为一个“块”以添加到块链中,其中包含一个名为data的数组属性,该属性包含一个对象,在该对象中的更深处,它最终包含eccrypto https://github.com/bitchan/eccrypto公钥。我需要访问公钥,但它总是返回未定义的(公钥几乎肯定不是问题,而是上下文问题)。

登录时,用户获取区块链,代码根据表单输入缩小所需数据(表单+处理表单代码可能与此无关)。

我设置了一个等于chaini.data.members.user字段的变量,该变量是通过从服务器获取块链(链是具有不同索引块的块链,在处理目标块之后,它将使用一个具有“名称”键的对象和一个成员数组访问其数据数组,其中存储其索引中的所有用户对象)。

缩小了登录后端的问题:

代码语言:javascript
复制
let tester = await decryptMes(chain[i].data[0].members[0].user);
//user public key is passed to data in decryptMes() parameters.
代码语言: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;
}

在解密函数中,第11行的调试字符串返回“数据返回未定义”。

重要控制台消息:

代码语言:javascript
复制
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)

注意到:当我在postman上获取区块链时,它显示“成员”数组中有一个对象,但是当我尝试在函数中或在登录函数的任何范围内打印它时,它怎么会出现在postman上,而没有定义呢?

邮递员展示:

代码语言:javascript
复制
    {
        "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中有很多要学的东西。谢谢

下面的您可以签出登录客户端后端,如果您需要

登录后端:

代码语言: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;
}
代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-07 15:59:28

基于访问问题中的对象,用户应该使用members[0][0],所以只需尝试

代码语言:javascript
复制
chain[i].data[0].members[0][0].user
票数 0
EN

Stack Overflow用户

发布于 2021-02-09 07:32:00

如果我正确理解,服务器将返回一个JSON对象,这就是您所称的chain。如果是这样,则将对象视为数组。在某种程度上,它确实可以工作,但它正在返回对象的第一个属性。这是因为在javascript中,对象的行为几乎与PHP中的关联数组类似。

而且,正如Mohammad Yaser Ahmadi所指出的,members属性是一个数组,它包含一个对象,该对象的属性由数字命名。

尝试将chain[i].data[0].members[0].user更改为chain.data[0].members[0][0].user

只是一个提示:当将数据记录到控制台时,请使用JSON.stringify()。例如,console.log(JSON.stringify(chain, null, 2))。它使调试时的生活更容易一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66041497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档