我知道这应该如何工作。如果我有一个变量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])
数据和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
我的问题是这怎么可能,正在发生什么以及如何解决它,以便我可以正常引用对象属性?