开发者问题收集

我应该检查什么?未捕获(在承诺中)TypeError:无法读取未定义 URL 的属性“MyFunctionName”

2022-10-18
276

该问题仅发生在已编译的应用程序中,因此我猜测这是特定于浏览器的特定问题,但我不确定:

我已将以下脚本添加到网页:

async function exportChatAsXMLHelper(params){
    let displayname     = params[0];
    let includeMedia    = params[1];
    let debug           = params[2];
    
    await exportChatAsXML(displayname, includeMedia, debug);
}

async function exportChatAsXML(displayname, includeMedia, debug)
{

    let chat = (await WPP.chat.list()).find(m => m.contact && m.contact.name && m.contact.name.includes(displayname));
    await WPP.chat.openChatBottom(chat.id);
    let msgs = await WPP.chat.getMessages(chat.id, {count : -1});

    const log = (obj) => debug && console.log(obj);
    
    log('Total messages: ' + msgs.length);

    let count=msgs.length;

    for (var i = 0; i < count; i++) {
        log('Message number: ' + i);

        let message = msgs[i];
        let xml='';
        xml+= '<message>';
        xml+= '<sender>'+ message.from.user +'</sender>';
        xml+= '<receiver>'+ message.to.user +'</receiver>';

        xml+= '<type>'+ (message.type || '') +'</type>';

        if(message.type == 'chat')
        {
            xml+= '<body>'+ message.body +'</body>';
        }

        if(message.type != 'chat' && includeMedia) 
        {
            xml+= '<media>';
            xml+= '<caption>'+ (message.caption || '') +'</caption>';
            xml+= '<filename>'+ (message.filename || '') +'</filename>';

            log('Downloading media');

            try
            {
                let mediabody = await mediatoBase64(message.id);
                xml+= '<MediaDownloadStatus>success</MediaDownloadStatus>';
                xml+= '<base64>'+ mediabody +'</base64>';
            }
            catch(e)
            {
                xml+= '<base64></base64>';
                xml+= '<MediaDownloadStatus>fail</MediaDownloadStatus>';
            }
            xml+= '</media>';
        }

        xml+= '</message>';

        alert('before'); //this is still shown

        //where is JSCallbackReceiver defined? it is from vb6
       window.JSCallbackReceiver.OnWhatsAppXMLReceived(i, count, xml);
       
       alert('after'); //this is not shown

       xml='';
    }
}


//-----
async function mediatoBase64(msgid) {
    let blob = await WPP.chat.downloadMedia(msgid);
    return new Promise((resolve, _) => {
        const reader = new FileReader();
        reader.onloadend = () => resolve(reader.result);
        reader.readAsDataURL(blob);
    });
}

它在我的开发人员的机器上运行良好,但在客户的机器上会抛出错误:

Uncaught (in promise) TypeError: Cannot read property 'OnWhatsAppXMLReceived' of undefined https://web.whatsapp.com/ 80

我现在添加了一些警报,以查看到底哪里出了问题。 显示“之前”警报,不显示“之后”警报,因此错误肯定发生在

window.JSCallbackReceiver.OnWhatsAppXMLReceived(i, count, xml);
   alert('after');

我可以检查什么来查看客户端机器上到底出了什么问题/有什么不同?

回调对象在 VB6 中定义如下:

Private m_JSCallback As clsJSCallbackReceiver

Set m_JSCallback = New clsJSCallbackReceiver
Me.webkit1.AddObject "JSCallbackReceiver", m_JSCallback

错误消息是否意味着浏览器找不到我通过 AddObject 添加的对象?

我正在使用基于 Chromium 的 mobileFx webkit 浏览器 ,但我想这并不重要。

这是类 clsJSCallbackReceiver 在 VB6 中的样子:

Option Explicit
    
Public Sub OnWhatsAppXMLReceived(ByVal uIndex As Long, ByVal uCount As Long, ByVal uXml As String)

     Debug.Print("I was called!")
    
 End Sub

 Public Sub SaySomething(ByVal u As String)
     MsgBox(u)
 End Sub

谢谢你!

编辑:

我只在编译时发生。 当我在 VB6 IDE 中运行它时,它工作正常。

错误发生后,我仍然可以调用

m_JSCallback.SaySomething("Hello!")

,它会工作。

所以对象还活着。 我猜它只是没有连接到浏览器。

2个回答

我找到了 此文档 ,其中提到了他们给出的一个示例:

“接下来,由于类的 Instancing 属性为 PublicNotCreatable,因此项目必须为客户端提供一种实例化对象的方法。在标准模块中添加一个新函数。其中 clsEmployee 是相关类的名称。此外,这不应是私有模块。”

而您的代码似乎与此相矛盾。

János Aracsi
2022-10-23

错误消息向您解释了以下行:

window.JSCallbackReceiver.OnWhatsAppXMLReceived(i, count, xml);

window.JSCallbackReceiver 对象未定义。

首先,要摆脱此错误消息,您应该将此行替换为:

if (window.JSCallbackReceiver) {
    window.JSCallbackReceiver.OnWhatsAppXMLReceived(i, count, xml);
}

这不会解决您的问题,因为它只是抑制了错误。

因此,您需要调查为什么 SCallbackReceiver 在客户的浏览器上未定义。

要获得更多帮助,您需要提供有关 JSCallbackReceiver 的源代码。

Alaindeseine
2022-10-21