当前位置: 首页 > 知识库问答 >
问题:

如何在Firebase的云函数中使HTTP请求异步/等待?

籍永安
2023-03-14

我试图使一个JSON调用异步/等待使用云函数为Firebase。

你知道如何修复下面的代码吗?我的计划失败了。

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

部署误差

函数[setDetails]:部署错误。

异步URL

SyntaxError:对象的createScript(vm.js:56:10)处出现意外标识符。在模块上运行InthisContext(vm.js:97:10)_在对象处编译(module.js:542:28)。模块_扩展。。js(module.js:579:10)在模块中。在getUserFunction(/var/tmp/worker/worker.js:378:24)的require(internal/module.js:20:19)处加载(module.js:487:32)

指数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});
});

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

共有2个答案

魏安宁
2023-03-14

另一种解决方案不是使用async wait,而是使用另一个名为request promise any

隗星驰
2023-03-14

云函数还不支持异步/等待。云函数运行Node6,它不使用支持async/await的JavaScript版本。部署失败,因为它不知道async关键字。

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

 类似资料:
  • 问题内容: PHP中有没有办法进行异步HTTP调用?我不在乎响应,我只想做类似的事情,但不等待请求完成再执行其余代码。这对于在我的应用程序中触发某种“事件”或触发较长的进程非常有用。 有任何想法吗? 问题答案: 我以前接受的答案没有用。它仍然在等待回应。但这确实有效,取自我如何在PHP中发出异步GET请求?

  • 问题内容: 我对后端非常熟悉。但是我遇到了一种情况,我必须在前端使用它。 我正在获取对象的数组,并且在那些对象中我获取了位置。现在,我可以获取单个地名,但是我想在map函数中使用该名称来获取地名。因此,正如我们所知道的那样,我必须在那边使用。 这是代码 但是,当我在此处将map函数与async一起使用时,它不会返回任何内容。谁能帮我解决我的问题? 谢谢!!! 问题答案: 您应该始终将获取数据等关注

  • 问题内容: 在我的程序中,我从另一个API模块调用了我的函数: 模块代码: 执行立即返回,但是,并因此包含请求对象和请求体- 样,不需要响应体。 我做错了什么?怎么修?正确的用法是什么,或仅与此处提到的Promise一起正确使用:为什么await对于节点请求模块不起作用?以下文章提到了可能的方法:在Node.js中掌握Async Await 。 问题答案: 您需要使用模块,而不是模块或。 对返回p

  • 我试图用Firebase函数做一个理论上相对简单的函数。 具体地说: > 向所有用户的实时数据库变量添加 向所有用户发送通知 我仍然在努力理解/,这可能就是为什么我在这个问题上如此纠结的原因。 我正在做的是: 然后就有了: 和函数: 我当前得到的错误是: “Await”表达式仅允许在异步函数中使用。 const devices=await devicesref.get(); 但即使我得到它没有错误

  • 问题内容: 我的量角器conf.js 函数需要发出一个看起来像这样的http请求, 它会引发错误, 还有其他方法可以强制在测试开始执行之前调用内部回调吗? 问题答案: 可以选择返回量角器在开始执行测试之前将解决的承诺: 可以选择返回一个承诺,量角器将在继续执行之前等待。如果准备工作涉及任何异步调用,例如与浏览器进行交互,则可以使用此方法。否则,量角器不能保证执行顺序,并可能在准备工作完成之前开始测

  • 我有2个微服务(A和B)。 有一个接受POST请求的endpoint。当用户发出发布请求时,会发生以下情况: 服务A从POST请求正文中获取对象并将其存储在数据库中。 服务A将对象转换为不同的对象。新对象通过泽西HTTP客户端发送到服务B。 步骤 2 发生在我创建的 Java 线程池(Executors.new缓存线程池)上。通过在新线程上执行步骤 2,服务 A 的终结点的响应时间不受影响。 但是