Javascript Firebase云功能更新数据库需要5分钟以上
控制台显示该功能已在2-3秒内执行。但在数据库中更新大约需要5分钟。云函数花费如此长的时间传播更改是否正常?有没有办法把延迟缩短到几秒钟 下面是云函数的代码。我通过url访问触发它。我知道代码有味道,但这只是一个原型Javascript Firebase云功能更新数据库需要5分钟以上,javascript,firebase,google-cloud-firestore,google-cloud-functions,Javascript,Firebase,Google Cloud Firestore,Google Cloud Functions,控制台显示该功能已在2-3秒内执行。但在数据库中更新大约需要5分钟。云函数花费如此长的时间传播更改是否正常?有没有办法把延迟缩短到几秒钟 下面是云函数的代码。我通过url访问触发它。我知道代码有味道,但这只是一个原型 const listID = req.query.id; const user = req.query.user; const code = req.query.code; const title = req.query.title; con
const listID = req.query.id;
const user = req.query.user;
const code = req.query.code;
const title = req.query.title;
const desc = req.query.desc;
var docRef = admin.firestore().collection('users/' + user.toString() + '/wordLists/' + listID.toString() + '/words');
var docRef2 = admin.firestore().doc("users/" + user.toString() + "/wordLists/" + listID.toString());
var docRef3 = admin.firestore().doc("users/" + user.toString()); //new
var description, length, name, courseId;
description = desc;
name = title;
console.log("Description: " + description + ", d: " + desc);
docRef2.get().then(
function(doc) {
if (doc.exists) {
length = doc.data().length;
courseId = user.toString()+","+listID.toString()+"," + code.toString();
admin.firestore().collection('courses').doc(courseId).set({
description: description,
id: courseId,
length: length,
name: name,
creator: user,
downloads: 0,
rating: 0,
published: true,
});
} else {
console.log("FAILED users/" + user.toString() + "/wordLists/" + listID.toString());
}
return "Done";
}).catch(function(error) {
console.log("Error getting document:", error);
});
docRef.get().then(function(querySnapshot){
querySnapshot.forEach(function(doc) {
if (doc.exists) {
var mid = doc.data().meaningID;
var smi = doc.data().subMeaningIndex;
var docId = mid.toString() + "," + smi.toString();
admin.firestore().collection('courses/'+ courseId + '/words').doc(docId).set({
examples: doc.data().examples,
meaningID: mid,
subMeaning: doc.data().subMeaning,
subMeaningIndex: smi,
word: doc.data().word,
});
} else {
console.log('users/' + user.toString() + '/wordLists/' + listID.toString() + '/words');
}
//return "Done";
});
return "Done2";
}).catch(function(error) {
console.log("Error getting document:", error);
});
docRef3.get().then(
function(doc) {
if (doc.exists) {
var l = doc.data().coursesCreated;
l.push(courseId);
docRef3.update({coursesCreated: l});
} else {
console.log("users/" + user.toString() + "/wordLists/" + listID.toString());
}
return "Done";
}).catch(function(error) {
console.log("Error getting document:", error);
});
res.send("Success");
这里是控制台输出。您可以看到4:26的console.log输出是在他们说函数执行完成之后出现的
在代码中,由于执行了基于承诺的非阻塞函数,res.send部分将立即被访问。正如Doug所写,您应该将其放入承诺回调中 您应该在.then块中发送res.send,或者在.catchblock中发送res.status500.send,并且只发送一次
如果您不想处理承诺级联,也可以在try/catch结构中使用async/await。您没有正确处理承诺。然后打电话,并抓住每一个是不够的。您需要确保res.send仅在每个承诺解决后执行。仅仅把它放在底部是不够的——承诺必须被拴住。