12

Tôi có một chức năng đám mây được sử dụng để tham chiếu hai danh sách và tìm các giá trị khớp với nhau trên danh sách. Chức năng này có vẻ hoạt động bình thường, tuy nhiên trong nhật ký tôi vẫn thấy số Error serializing return value: TypeError: Converting circular structure to JSON này. Đây là chức năng ...Chức năng đám mây cho Firebase - Lỗi nối tiếp giá trị trả về:

exports.crossReferenceContacts = functions.database.ref('/cross-ref-contacts/{userId}').onWrite(event => { 

    if (event.data.previous.exists()) { 
     return null; 
    } 

    const userContacts = event.data.val(); 
    const completionRef = event.data.adminRef.root.child('completed-cross-ref').child(userId); 
    const removalRef = event.data.ref; 

    var contactsVerifiedOnDatabase ={}; 
    var matchedContacts= {}; 


    var verifiedNumsRef = event.data.adminRef.root.child('verified-phone-numbers'); 
    return verifiedNumsRef.once('value', function(snapshot) { 

     contactsVerifiedOnDatabase = snapshot.val(); 

     for (key in userContacts) { 
      //checks if a value for this key exists in `contactsVerifiedOnDatabase` 
      //if key dioes exist then add the key:value pair to matchedContacts 
     }; 

     removalRef.set(null); //remove the data at the node that triggered this onWrite function 
     completionRef.set(matchedContacts); //write the new data to the completion-node 

    }); 

}); 

Tôi đã thử đưa return trước completionRef.set(matchedContacts); nhưng vẫn mang lại cho tôi lỗi. Không chắc chắn những gì tôi đang làm sai và làm thế nào để thoát khỏi lỗi. Nhờ sự giúp đỡ của bạn

Trả lời

0

Hãy thử:

return verifiedNumsRef.once('value').then(function(snapshot) { 
    contactsVerifiedOnDatabase = snapshot.val(); 

    for (key in userContacts) { 
     //checks if a value for this key exists in `contactsVerifiedOnDatabase` 
     //if key dioes exist then add the key:value pair to matchedContacts 
    }; 

    return Promise.all([ 
     removalRef.set(null), //remove the data at the node that triggered this onWrite function 
     completionRef.set(matchedContacts) 
    ]).then(_ => true); 
}); 
+0

Ok tôi sẽ thử điều này. Bạn có thể giải thích 'Promise.all ([...])' là gì không? – MikeG

+1

@MikeG Để tìm hiểu về các lời hứa và cách chúng hoạt động với Chức năng đám mây, hãy xem blog này bằng video được nhúng: https://firebase.googleblog.com/2017/06/keep-your-promises-when-using-cloud.html –

+1

@MichaelBleigh Tôi vẫn gặp lỗi tương tự sau khi thử số này – MikeG

7

Tôi đã có vấn đề chính xác tương tự khi trở về nhiều hứa hẹn rằng giao dịch trên cơ sở dữ liệu căn cứ hỏa lực. Lúc đầu, tôi đã gọi điện thoại:

return Promise.all(promises); 

đối tượng promises tôi là một mảng mà tôi đang sử dụng, nơi tôi đang đẩy tất cả các công việc mà cần phải được thực hiện bằng cách gọi promises.push(<add job here>). Tôi đoán rằng đây là một cách hiệu quả để thực hiện các công việc kể từ bây giờ các công việc sẽ chạy song song.

Chức năng đám mây hoạt động nhưng tôi đã nhận được lỗi chính xác giống như bạn mô tả.

Nhưng, như Michael Bleigh gợi ý về lời nhận xét của mình, thêm then cố định vấn đề này và tôi không còn thấy rằng lỗi:

return Promise.all(promises).then(() => { 
    return true; 
}).catch(er => { 
    console.error('...', er); 
}); 

Nếu điều đó không giải quyết được vấn đề của bạn, có thể bạn cần phải chuyển đổi của bạn đối tượng tròn sang định dạng JSON. Một ví dụ được viết ở đây, nhưng tôi đã không thử rằng: https://stackoverflow.com/a/42950571/658323 (nó đang sử dụng thư viện json tròn).

CẬP NHẬT tháng 12 năm 2017: Dường như trong phiên bản mới nhất Chức năng Cloud, một chức năng điện toán đám mây sẽ mong đợi một giá trị trả về (hoặc là một lời hứa hay một giá trị), vì vậy return; sẽ gây ra các lỗi sau: Function returned undefined, expected Promise or value mặc dù chức năng sẽ được thực thi. Do đó, khi bạn không trả lại lời hứa và bạn muốn chức năng đám mây kết thúc, bạn có thể trả về một giá trị ngẫu nhiên, ví dụ: return true;

+1

Cảm ơn bạn đã cập nhật tháng 12 năm 2017! – johnozbay

0

Tôi đã có cùng một đầu ra lỗi với thiết lập khá giống nhau và không thể tìm ra cách loại bỏ lỗi này. Tôi không hoàn toàn chắc chắn nếu mọi bản chất đã bị bắt bởi các câu trả lời trước đó vì vậy tôi để lại cho bạn giải pháp của tôi, có lẽ nó sẽ giúp bạn.

Nguyên mã của tôi trông như thế này:

return emergencyNotificationInformation.once('value', (data) => { 
    ... 
    return; 
}); 

Nhưng sau khi thêm sau đó và bắt lỗi đã biến mất.

return emergencyNotificationInformation.once('value') 
    .then((data) => { 
     ... 
     return; 
    }) 
    .catch((error) => { 
     ... 
     return: 
    }); 
} 
Các vấn đề liên quan