如何在 Cloud Functions for Firebase 中使 HTTP 请求异步/等待?

Posted

技术标签:

【中文标题】如何在 Cloud Functions for Firebase 中使 HTTP 请求异步/等待?【英文标题】:How to make HTTP request async/await in Cloud Functions for Firebase? 【发布时间】:2018-08-13 13:14:25 【问题描述】:

我正在尝试使用 Cloud Functions for Firebase 使用 async/await 进行 JSON 调用。

知道如何修复以下代码吗?我的计划是 Blaze。

我的灵感是https://www.valentinog.com/blog/http-requests-node-js-async-await/

部署错误

functions[setDetails]:部署错误。

const getDetails = async url =>

SyntaxError:意外的标识符 在 createScript (vm.js:56:10) 在 Object.runInThisContext (vm.js:97:10) 在 Module._compile (module.js:542:28) 在 Object.Module._extensions..js (module.js:579:10) 在 Module.load (module.js:487:32) 在需要(内部/module.js:20:19) 在 getUserFunction (/var/tmp/worker/worker.js:378:24)

INDEX.JS

'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');    
// Promise based HTTP client for the browser and node.js
const axios = require('axios');

admin.initializeApp(functions.config().firebase);
const url = 'https://api.xxxx.com/json?partnumber=';
const getDetails = async url => 
    try 
        const response = await axios.get(url);
        const data = response.data;
        const getDet = data.results[0].details;
        return getDet;
     catch (error) 
        console.log(error);
        return error;
    
;
exports.setDetails = functions.database.ref('/equipment/pushId').onWrite((event) => 
  const post = event.data.val();
  if (post.details) return ;
  const number = post.number;
  const details = getDetails(url + number);
  admin.database().ref('/equipment/pushId').push(number: number, details: details);
);

PACKAGE.JSON


  "name": "look-at-details",
  "description": "bla bla bla",
  "dependencies": 
    "axios": "^0.18.0",
    "firebase-admin": "^5.9.1",
    "firebase-functions": "^0.8.1"
  ,  
  "scripts": 
    "serve": "firebase serve --only functions",
    "shell": "firebase experimental:functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  

【问题讨论】:

错误是哪一行? @PeterHaddad 第 9 行到第 19 行。 @PeterHaddad 在第 13 行,我尝试使用 $data.results[0].details。发生同样的错误 Error: Error occurred while parsing your function triggers. /home/MyID/MyFolder/functions/index.js:19 ); 您能否编辑问题以显示部署的整个输出,而不仅仅是一个错误日志行? 【参考方案1】:

Cloud Functions 尚不原生支持 async/await。 Cloud Functions 运行节点 6,它不使用支持 async/await 的 javascript 版本。部署失败,因为它不知道 async 关键字。

相反,您可以初始化项目以使用支持异步/等待的 TypeScript。 Firebase CLI 会自动将您的代码转换为使用 Promises 实现 async/await 的 ES6。

【讨论】:

GCF 现在支持 async/await,你已经知道了。 :)【参考方案2】:

除了使用async wait,另一种解决方案是使用另一个名为request-promise-any 的库

【讨论】:

以上是关于如何在 Cloud Functions for Firebase 中使 HTTP 请求异步/等待?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Cloud Functions for Firebase 获取子值的键?

如何在 Cloud Functions for Firebase 中发出 HTTP 请求?

如何在 Cloud Functions for Firebase 中使 HTTP 请求异步/等待?

如何在 PC 上本地测试 Cloud Functions for Firebase

如何使用 Firestore 在 Cloud Functions for Firebase 中获取服务器时间戳?

如何在 Cloud Functions for Firebase 中访问多个实时数据库实例