首页 > 解决方案 > 由于某种原因,无法使用变量查找对象属性

问题描述

我知道这应该如何工作。如果我有一个变量 x="property" 和一个看起来像 y={property: "value"} 的对象,那么 y[x] 应该返回 "value"。到目前为止,这对我有用,但是我的代码中发生了某种奇怪的错误。这是我遇到问题的功能:

const { textToSpeech } = require("../text-to-speech/tts");
const data = require("../Data/Data").data;

const genericSendMessage = async (userMessage, assistant) => {
  try{
    let res = await assistant.message({
      workspace_id: process.env.TTS_WORKSPACE,
      input: {"text": userMessage}
    })
    res = await JSON.stringify(res["output"]["text"][0], null, 2)
    res = generateResponse(res);
    await textToSpeech(res);
    return res;
  }catch(err){
    console.log("error in genericSendMessage:\n",err)
  }
}

const generateResponse = (watsonCode) => {
  console.log("========================\nwatsonCode: ",watsonCode,"\ndata: ",data,"\ndata[watsonCode]: ",data[watsonCode])
  console.log(Object.values(data))
    return data[watsonCode][Math.floor(Math.random()*data[watsonCode].length())]
}

module.exports = genericSendMessage;

如果您查看此 console.log:

console.log("========================\nwatsonCode: ",watsonCode,"\ndata: ",data,"\ndata[watsonCode]: ",data[watsonCode])

data 和 watsonCode 都得到了很好的安慰,它们应该是这样的。data 是一个对象,而 watsonCode 是一个与该对象的属性相对应的字符串,但是 data[watsonCode] 每次都是未定义的。如果我将数据设为数组并将 watsonCode 设为数字(索引),也会发生同样的事情。我不知道这怎么可能。同样的事情以前也有效,如果我将 watsonCode 硬编码为 console.log 上方的 Number("1"),它工作正常,但如果获取 watsonCode 并得到“1”,然后执行 data[Number(watsonCode)] 它是未定义的。我尝试在 generateResponse 函数中执行 typeof(watsonCode) 以查看它是否仍然是一个承诺,但不,它是一个字符串。

这是数组版本(缩短)的 console.log 的样子:

========================
watsonCode:  "1" 
data:  [[...],[...],[...],...] //I removed the data here as it is somewhat sensitive but it's just a 2D array of strings
data[Number(watsonCode)]:  undefined
error in genericSendMessage:
 TypeError: Cannot read property 'length' of undefined

我的问题是这怎么可能,发生了什么以及如何修复它以便我可以正常引用对象属性?

标签: javascriptnode.js

解决方案


推荐阅读