TLDR:向我的Firestore成功写入JSON后,下一个请求将给我内部服务器错误(500)。我怀疑问题是插入尚未完成。
所以基本上,我有以下代码:
const jsonToDb = express();
exports.jsondb = functions.region('europe-west1').https.onRequest(jsonToDb);
jsonToDb.post('', (req, res) => {
let doc;
try {
doc = JSON.parse(req.body);
} catch(error) {
res.status(400).send(error.toString()).end();
return;
}
myDbFuncs.saveMyDoc(doc);
res.status(201).send("OK").end();
}
数据库功能位于另一个JS文件中。
module.exports.saveMyDoc = function (myDoc) {
let newDoc = db.collection('insertedDocs').doc(new Date().toISOString());
newDoc.set(myDoc).then().catch();
return;
};
所以我有几种理论,也许其中一种并没有错,但是请帮助我。 (另外,如果我在这个小片段中犯了一些错误,请告诉我。)
复制:
我发送了第一个请求=>一切正常,数据库中的Json。
在第一个请求给我确定状态后,我发送了第二个请求=>几秒钟没有执行任何操作,然后500:内部服务器错误。
日志:函数执行耗时4345 ms,状态为:“连接错误”。
我只是不明白。假设我正在将其用作API,同时有多个请求。 它不能处理吗?(我想它可以处理,只是做一些愚蠢的事情。)故意地,我要在第一个请求完成后发送第二个请求,并且这种情况会发生。 我应该使saveMyDoc异步吗?
答案 0 :(得分:1)
saveMyDoc不会返回所有异步工作完成后都会解决的承诺。如果您无法兑现承诺,Cloud Functions将关闭工作并在工作完成之前进行清理,从而使其看起来根本无法使用。在所有工作完全完成之后,您只能在 之后发送来自HTTP类型函数的响应。
至少应该看起来像这样:
module.exports.saveMyDoc = function (myDoc) {
let newDoc = db.collection('insertedDocs').doc(new Date().toISOString());
return newDoc.set(myDoc);
};
然后您将在主要功能中使用promise:
myDbFuncs.saveMyDoc(doc).then(() => {
res.status(201).send("OK").end();
}
查看仅在保存数据后如何发送响应。
在documentation中了解有关Cloud Functions中异步编程的更多信息。还请观看此video series,其中讨论了如何在Cloud Functions中使用Promise。