TLDR:在将JSON(成功)写入我的Firestore后,下一个请求将给我内部服务器错误(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在数据库中。
我在第一个请求后发送第二个请求,状态为OK=>它在几秒钟内没有任何作用,然后500:内部服务器错误。
日志:函数执行耗时4345毫秒,已完成,状态为:"连接错误"。
我就是不明白。让我们想象一下,我将其作为一个API,同时使用多个请求它处理不了吗(我想它可以处理,只是我做了一些愚蠢的事情。)我故意在第一个请求完成后发送第二个请求,结果发生了这种情况。我应该使saveMyDoc异步吗
saveMyDoc没有返回在所有异步工作完成时解析的promise。如果你忘记了承诺,Cloud Functions会在工作完成前关闭工作并进行清理,使其看起来根本不起作用。您应该只在所有工作完全完成后才从HTTP类型函数发送响应。
至少,它应该看起来更像这样:
module.exports.saveMyDoc = function (myDoc) {
let newDoc = db.collection('insertedDocs').doc(new Date().toISOString());
return newDoc.set(myDoc);
};
然后你会在你的主要功能中使用承诺:
myDbFuncs.saveMyDoc(doc).then(() => {
res.status(201).send("OK").end();
}
查看如何仅在保存数据后发送响应。
阅读文档中有关云函数中异步编程的更多信息。还可以观看本系列视频,该系列视频讲述了如何在云功能中使用承诺。