firebase - 缓慢且不可靠的 Firebase Cloud Functions

标签 firebase google-cloud-firestore google-cloud-functions

在我正在构建的应用程序中,用户可以请求一个单词,应用程序会转到在线牛津词典 API 来获取定义、发音等。我使用 Firebase Cloud Functions 进行 HTTP 请求,并编写对 Cloud Firestore 的响应。有时它会起作用......缓慢。十分之九的数据不会写入 Firestore。

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const request = require('request'); // node module to send HTTP requests

admin.initializeApp();

exports.oxford_English_US = functions.firestore.document('Users/{userID}/English_American/Word_Request').onUpdate((change, context) => {
console.log(change.before.data());
console.log(change.after.data());
console.log(context.params.userID);
if (change.after.data().word != undefined) {
  let options = {
    url: 'https://od-api.oxforddictionaries.com/api/v1/entries/en/' + change.after.data().word + '/pronunciations%3Bregions%3Dus',
    headers: {
      "Accept": "application/json",
      'app_id': 'TDK',
      'app_key': 'swordfish'
    }
  };
  function callback(error, response, body) {
    console.log(response.statusCode);
    if (error) {
      console.log(error)
          }
    if (!error && response.statusCode == 200) {
      var word = JSON.parse(body);
      console.log(word);
      admin.firestore().collection('Users').doc(context.params.userID).collection('English_American').doc('Word_Response').set({
        'metadata': word.metadata,
        'results': word.results
      })
       .then(function() {
        console.log("Document written.");
      })
      .catch(function(error) {
        console.log("Error writing document: ", error);
      })
    }
  }
  request(options, callback);
} else {
  console.log("change.after.data().word === undefined");
}
return 0;

});

这是一个函数调用的日志:

12:55:12.780 PM oxford_English_US { metadata: { provider: 'Oxford University Press' }, results: [ { id: 'to', language: 'en', lexicalEntries: [Object], type: 'headword', word: 'to' } ] }
12:55:12.480 PM oxford_English_US 200
12:55:09.813 PM oxford_English_US Function execution took 3888 ms, finished with status: 'ok'
12:55:09.739 PM oxford_English_US bcmrZDO0X5N6kB38MqhUJZ11OzA3
12:55:09.739 PM oxford_English_US { word: 'to' }
12:55:09.732 PM oxford_English_US { word: 'have' }
12:55:05.926 PM oxford_English_US Function execution started

该函数在四秒内执行。函数执行完毕三秒后,“200”状态代码和数据一起返回。数据永远不会写入 Firestore。

看起来云函数不会等待 HTTP 响应。

这是另一个函数日志,其中云函数在发送 HTTP 请求之前似乎已完成执行:

  1:02:29.319 PM oxford_English_US Function execution took 3954 ms, finished with status: 'ok'
  1:02:29.218 PM oxford_English_US bcmrZDO0X5N6kB38MqhUJZ11OzA3
  1:02:29.218 PM oxford_English_US { word: 'to' }
  1:02:29.213 PM oxford_English_US { word: 'the' }
  1:02:25.365 PM oxford_English_US Function execution started

有没有更好的 Node 模块来发送 HTTP 请求? 请求具有以下语法:

request(options, callback);

我宁愿返回一个 promise 而不是回调。

最佳答案

您的 Google Cloud Function 应始终返回 Promise。如果您未能返回 Promise,您将面临应用程序容器可能在代码完成之前被拆除的情况。

来自您的示例代码:

exports.oxford_English_US = functions.firestore.document('Users/{userID}/English_American/Word_Request').onUpdate((change, context) => {
 
  return new Promise(function(resolve, reject) {
      // put your code here and resolve() or reject() based on outcome
  });

}

来自 Firebase YouTube channel (2.后台触发器 - 返回 promise )“您必须返回一个 promise ,当该函数中的待处理工作完成时,该 promise 将被履行或拒绝。这可以让 Cloud Functions 知道何时可以安全地进行清理函数调用并继续下一个。”

https://youtu.be/652XeeKNHSk?t=44s

关于firebase - 缓慢且不可靠的 Firebase Cloud Functions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50031397/

相关文章:

android - 在Android Studio中构建统一项目(具有Firebase)时出错

firebase - 在 firestore 规则中限制子集合中的文档数量

javascript - 从 firebase 云函数上传图像到云存储

javascript - 如何在 Firebase 函数中处理字体等资源

firebase - Electron 应用程序上的 Firebase 错误 : Failed to load gRPC

firebase - 添加 Firebase 任务队列函数时如何从 Google Cloud Tasks 获取自动生成的任务名称?

ios - 使用 Swift4 从 Firebase 读取数据 - 有 childByAutoId 上层节点

firebase - 需要Docker Firestore项目ID

ios - Swift:我无法将 Firebase FIRAuth 函数中的变量传回父函数中声明的变量

firebase - 如何在 Firebase 上进行事件驱动