Cloud Functions for Firebase 超时

Posted

技术标签:

【中文标题】Cloud Functions for Firebase 超时【英文标题】:Cloud Functions for Firebase timeout 【发布时间】:2018-01-03 22:08:24 【问题描述】:

获取数据库数据的简单云功能不起作用。

getusermessage() 不工作

错误:

函数执行耗时 60002 毫秒,完成状态为:'timeout'

Index.JS 用于获取数据库结果。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const cors = require('cors')(origin: true);

// Take the text parameter passed to this HTTP endpoint and insert it into the
// Realtime Database under the path /messages/:pushId/original
exports.addMessage = functions.https.onRequest((req, res) => 
  // Grab the text parameter.
  const original = req.query.text;
  // Push the new message into the Realtime Database using the Firebase Admin SDK.
  admin.database().ref('/messages').push(original: original).then(snapshot => 
    // Redirect with 303 SEE OTHER to the URL of the pushed object in the Firebase console.
    res.redirect(303, snapshot.ref);
  );
);

// Listens for new messages added to /messages/:pushId/original and creates an
// uppercase version of the message to /messages/:pushId/uppercase
exports.makeUppercase = functions.database.ref('/messages/pushId/original')
    .onWrite(event => 
      // Grab the current value of what was written to the Realtime Database.
      const original = event.data.val();
      console.log('Uppercasing', event.params.pushId, original);
      const uppercase = original.toUpperCase();
      // You must return a Promise when performing asynchronous tasks inside a Functions such as
      // writing to the Firebase Realtime Database.
      // Setting an "uppercase" sibling in the Realtime Database returns a Promise.
      return event.data.ref.parent.child('uppercase').set(uppercase);
    );

var db = admin.database();
exports.getUserMessage = functions.https.onRequest((req, res) => 
var query = db.ref("messages").orderByKey();
query.once("value")
  .then(function(snapshot) 
    snapshot.forEach(function(childSnapshot) 
      var key = childSnapshot.key;
      // childData will be the actual contents of the child
      var childData = childSnapshot.val();
  );
);  
);

O 做错了什么?

【问题讨论】:

【参考方案1】:

您可以在函数声明期间使用runWith 设置超时和内存,

exports.getUserMessage = functions.runWith( memory: '2GB', timeoutSeconds: 360 ).https.onRequest(

【讨论】:

【参考方案2】:

您没有说您的三个函数中的哪一个超时,但我会猜测哪个。您的 HTTPS 函数 getUserMessage 未生成对客户端的响应。 Cloud Functions 将等待 60 秒(默认情况下)以生成响应,如果没有,它将终止该函数并将该消息留在日志中。

HTTPS 函数中的每个代码路径都应该对客户端产生一些响应。

【讨论】:

@Dough 你猜是对的,但我没有得到你的答案,因为我说我正在尝试云功能。你能指出我在getUserMessage()中做错了什么吗? 正如我所说,您的函数不会向客户端生成响应。您绝对需要发送回复。有关更多详细信息,请参阅 HTTPS 函数的文档,尤其是名为“终止 HTTP 函数”的部分。 firebase.google.com/docs/functions/http-events @twister_void 您在 Doug 提到的函数中缺少 return 语句 @J.Doe 从 https 函数返回一个 promise 不会让它在它解析之前保持活动状态,就像其他类型的函数一样。您必须返回响应。请参阅我引用的文档。 @DougStevenson 我在这里遇到了类似的问题,但据我了解,只要 res.send/end/redirect 发生在 then/catch 或回调中,这就足够了。您似乎暗示应返回响应,无论 60 秒后是否解决问题。是这样吗?如果您返回 Promise,该代码将如何运行?

以上是关于Cloud Functions for Firebase 超时的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase Cloud Functions 测试中模拟 FCM admin.messaging().sendToDevice() 的实现

如何使用 Google Python Client for Cloud Functions 获取 Google Cloud Functions 列表?

Cloud Functions for Firebase 超时

Cloud Functions for Firebase onWrite 超时

在 Cloud Functions for Firebase 中访问 db 数据

Cloud Functions for Firebase 组织