admin管理员组文章数量:1335134
I have some code that works sometimes, but sometimes it does not. When it does not run, I get this error:
This is my code in Javascript:
exports.handleRequest = functions.database.ref('/Request/{usersUID}/{autoID}/{request}').onWrite(event => {
let request = event.data.val();
let additionalRequest = event.data.key;
let usersUID = event.params.usersUID;
const generatedAutoID = event.params.autoID;
event.data.adminRef.remove();
if (event.data.previous.exists()) {
return;
}
if (!event.data.exists()) {
return;
}
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var db = admin.database();
var MasterAllCards = ["2_of_clubs", "2_of_spades", "2_of_diamonds", "2_of_hearts", "3_of_clubs", "3_of_spades", "3_of_diamonds", "3_of_hearts", "4_of_clubs", "4_of_spades", "4_of_diamonds", "4_of_hearts", "5_of_clubs", "5_of_spades", "5_of_diamonds", "5_of_hearts", "6_of_clubs", "6_of_spades", "6_of_diamonds", "6_of_hearts", "7_of_clubs", "7_of_spades", "7_of_diamonds", "7_of_hearts", "8_of_clubs", "8_of_spades", "8_of_diamonds", "8_of_hearts", "9_of_clubs", "9_of_spades", "9_of_diamonds", "9_of_hearts", "10_of_clubs", "10_of_spades", "10_of_diamonds", "10_of_hearts", "jack_of_clubs", "jack_of_spades", "jack_of_diamonds", "jack_of_hearts", "queen_of_clubs", "queen_of_spades", "queen_of_diamonds", "queen_of_hearts", "king_of_clubs", "king_of_spades", "king_of_diamonds", "king_of_hearts", "ace_of_clubs", "ace_of_spades", "ace_of_diamonds", "ace_of_hearts"]
var MasterAllValues = [2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14]
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
let pathToUsersTickets = db.ref('/users/' + usersUID + '/serverSideValues/Tickets');
var usersTickets = 0;
pathToUsersTickets.transaction(function(current) {
return (current || 0) - 1;
}).then(function(ticket) {
usersTickets = Number(ticket.snapshot.val())
});
if (usersTickets >= 0) {
let pathSettingUpGame = db.ref('/Checkrequests/' + usersUID + '/' + request);
let pathServer = db.ref('/Checkrequests/' + usersUID + '/' + request + '/Server');
var tags = [];
var images = [];
var allCards = MasterAllCards
var allCardsTags = MasterAllValues
var i = 0;
while (i < 5) {
let randomc = getRandomInt(0, 51 - i);
images.push(allCards[randomc])
tags.push(allCardsTags[randomc])
allCards.splice(randomc, 1);
allCardsTags.splice(randomc, 1);
i++
}
console.log(images);
console.log(tags[0])
console.log(allCards);
console.log(allCardsTags)
pathSettingUpGame.update({
"mastercard": images[0],
"highlowgametier" : 1
})
pathServer.update({
"child1image" : images[1],
"child2image" : images[2],
"child3image" : images[3],
"child4image" : images[4],
"child1tag" : tags[1],
"child2tag" : tags[2],
"child3tag" : tags[3],
"child4tag" : tags[4],
})
}
})
But sometimes it DOES run without any errors. You can check the code on here, where images[0] always is a string and never empty. How can this problem sometimes occur? No error:
And sometimes I get this, notice the undefined in the third value:
I have some code that works sometimes, but sometimes it does not. When it does not run, I get this error:
This is my code in Javascript:
exports.handleRequest = functions.database.ref('/Request/{usersUID}/{autoID}/{request}').onWrite(event => {
let request = event.data.val();
let additionalRequest = event.data.key;
let usersUID = event.params.usersUID;
const generatedAutoID = event.params.autoID;
event.data.adminRef.remove();
if (event.data.previous.exists()) {
return;
}
if (!event.data.exists()) {
return;
}
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
var db = admin.database();
var MasterAllCards = ["2_of_clubs", "2_of_spades", "2_of_diamonds", "2_of_hearts", "3_of_clubs", "3_of_spades", "3_of_diamonds", "3_of_hearts", "4_of_clubs", "4_of_spades", "4_of_diamonds", "4_of_hearts", "5_of_clubs", "5_of_spades", "5_of_diamonds", "5_of_hearts", "6_of_clubs", "6_of_spades", "6_of_diamonds", "6_of_hearts", "7_of_clubs", "7_of_spades", "7_of_diamonds", "7_of_hearts", "8_of_clubs", "8_of_spades", "8_of_diamonds", "8_of_hearts", "9_of_clubs", "9_of_spades", "9_of_diamonds", "9_of_hearts", "10_of_clubs", "10_of_spades", "10_of_diamonds", "10_of_hearts", "jack_of_clubs", "jack_of_spades", "jack_of_diamonds", "jack_of_hearts", "queen_of_clubs", "queen_of_spades", "queen_of_diamonds", "queen_of_hearts", "king_of_clubs", "king_of_spades", "king_of_diamonds", "king_of_hearts", "ace_of_clubs", "ace_of_spades", "ace_of_diamonds", "ace_of_hearts"]
var MasterAllValues = [2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14]
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
let pathToUsersTickets = db.ref('/users/' + usersUID + '/serverSideValues/Tickets');
var usersTickets = 0;
pathToUsersTickets.transaction(function(current) {
return (current || 0) - 1;
}).then(function(ticket) {
usersTickets = Number(ticket.snapshot.val())
});
if (usersTickets >= 0) {
let pathSettingUpGame = db.ref('/Checkrequests/' + usersUID + '/' + request);
let pathServer = db.ref('/Checkrequests/' + usersUID + '/' + request + '/Server');
var tags = [];
var images = [];
var allCards = MasterAllCards
var allCardsTags = MasterAllValues
var i = 0;
while (i < 5) {
let randomc = getRandomInt(0, 51 - i);
images.push(allCards[randomc])
tags.push(allCardsTags[randomc])
allCards.splice(randomc, 1);
allCardsTags.splice(randomc, 1);
i++
}
console.log(images);
console.log(tags[0])
console.log(allCards);
console.log(allCardsTags)
pathSettingUpGame.update({
"mastercard": images[0],
"highlowgametier" : 1
})
pathServer.update({
"child1image" : images[1],
"child2image" : images[2],
"child3image" : images[3],
"child4image" : images[4],
"child1tag" : tags[1],
"child2tag" : tags[2],
"child3tag" : tags[3],
"child4tag" : tags[4],
})
}
})
But sometimes it DOES run without any errors. You can check the code on here, where images[0] always is a string and never empty. How can this problem sometimes occur? No error:
And sometimes I get this, notice the undefined in the third value:
Share Improve this question edited Apr 20, 2018 at 20:14 Marie 3041 silver badge7 bronze badges asked Apr 28, 2017 at 23:57 J. DoeJ. Doe 13.1k9 gold badges75 silver badges140 bronze badges 2- You're not showing the entire function. I don't know what kind of function this is (database?) or what all the variables are (db?). What are you returning from the function? Have you tried putting console.log() statement in there to validate that the values are what you think they are? – Doug Stevenson Commented Apr 29, 2017 at 1:51
- I want to generate 5 random cards (strings for the image reference and tags) and upload them to the database. I updated my question with some more pictures. I can not understand why this is happening... – J. Doe Commented Apr 30, 2017 at 13:50
1 Answer
Reset to default 7The intermittent failures may be the result of your not returning a Promise
for the numerous asychronous Firebase operations your code performs. The Cloud Functions Guide explains:
It's important to manage the lifecycle of a function to ensure that it resolves properly... Also, you can make sure that the Cloud Functions instance running your function does not shut down before your function successfully reaches its terminating condition or state.
- Resolve functions that perform asynchronous processing by returning a JavaScript promise
Your code contains calls to remove()
, transaction()
and update()
. Each of these pletes asynchronously and returns a Promise
. You need to chain or bine (see Promise.all()) the returned Promises
, as needed, to ensure your function returns a Promise
for any ongoing, asynchronous Firebase operation.
For example, to handle the two calls to update()
at the end of the posted code:
const prom1 = pathSettingUpGame.update({
...
});
const prom2 = pathServer.update({
...
});
return Promise.all([prom1, prom2]);
There is also a Firebase video on returning Promises.
本文标签: javascriptUnhandled rejection from Cloud Functionbut it runs sometimesStack Overflow
版权声明:本文标题:javascript - Unhandled rejection from Cloud Function, but it runs sometimes - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1742258915a2442147.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论