成功请求后,Firebase的云函数无法处理请求



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;
};

所以我有几个理论,也许其中一个没有错,但请帮助我。(此外,如果我在这个小片段中犯了一些错误,请告诉我。)

复制:

  1. 我发送了第一个请求=>一切正常,Json在数据库中。

  2. 我在第一个请求后发送第二个请求,状态为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();
}

查看如何仅在保存数据后发送响应。

阅读文档中有关云函数中异步编程的更多信息。还可以观看本系列视频,该系列视频讲述了如何在云功能中使用承诺。

最新更新