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

时间:2019-01-15 16:35:51

标签: json express google-cloud-firestore google-cloud-functions

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

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

复制:

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

  2. 在第一个请求给我确定状态后,我发送了第二个请求=>几秒钟没有执行任何操作,然后500:内部服务器错误。

日志:函数执行耗时4345 ms,状态为:“连接错误”。

我只是不明白。假设我正在将其用作API,同时有多个请求。 它不能处理吗?(我想它可以处理,只是做一些愚蠢的事情。)故意地,我要在第一个请求完成后发送第二个请求,并且这种情况会发生。 我应该使saveMyDoc异步吗?

1 个答案:

答案 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。