未捕获的错误:Reference.push失败:

时间:2018-06-23 00:08:30

标签: javascript firebase cryptojs

因此,我正在使用cryptojs和firebase发送加密的消息,然后在聊天框中显示该加密的消息。我可以发送常规消息而没有任何加密,但是当我加密消息时。我最终收到此错误:

未捕获的错误:Reference.push失败:第一个参数包含属性'messages.text.init'中的一个函数,其内容= function(){                             subtype。$ super.init.apply(this,arguments);

我认为是因为我正在推送消息的加密,所以它是一种功能。 不确定。

    messageForm.addEventListener("submit", function (e) {
    e.preventDefault();

    var user = auth.currentUser;
    var userId = user.uid;
    if (user.emailVerified) {
        // Get the ref for your messages list
        var messages = database.ref('messages');

        // Get the message the user entered
        var message = messageInput.value;

        var myPassword = "11111";
        var myString = CryptoJS.AES.encrypt(message, myPassword);

        // Decrypt the after, user enters the key
        var decrypt = document.getElementById('decrypt')

        // Event listener takes input
        // Allows user to plug in the key
        // function will decrypt the message
        decrypt.addEventListener('click', function (e) {
            e.preventDefault();
            // Allows user to input there encryption password 
            var pass = document.getElementById('password').value;

            if (pass === myPassword) {
                var decrypted = CryptoJS.AES.decrypt(myString, myPassword);

                document.getElementById("demo0").innerHTML = myString;
                // document.getElementById("demo1").innerHTML = encrypted;
                document.getElementById("demo2").innerHTML = decrypted;
                document.getElementById("demo3").innerHTML = decrypted.toString(CryptoJS.enc.Utf8);
            }
        });

        // Create a new message and add it to the list.
        messages.push({
                displayName: user.displayName,
                userId: userId,
                pic: userPic,
                text: myString,
                timestamp: new Date().getTime() // unix timestamp in milliseconds

            })
            .then(function () {
                messageStuff.value = "";

            })
            .catch(function (error) {
                windows.alert("Your message was not sent!");
                messageStuff;
            });

1 个答案:

答案 0 :(得分:1)

看下面这行代码:

var myString = CryptoJS.AES.encrypt(message, myPassword);

myString不是字符串。我相信这是一个CipherParams对象。 (http://tenant-a.myapp.app。)然后,您尝试将该对象设为数据库中的字段:

messages.push({
        displayName: user.displayName,
        userId: userId,
        pic: userPic,
        text: myString,
        timestamp: new Date().getTime() // unix timestamp in milliseconds
})

这行不通。您需要在此处存储字符串而不是对象。尝试调用toString()的crypto()返回值来存储一个字符串,以后可以将其转换回所需的任何内容:

messages.push({
        displayName: user.displayName,
        userId: userId,
        pic: userPic,
        text: myString.toString(),
        timestamp: new Date().getTime() // unix timestamp in milliseconds
})