如何从 Firebase 函数调用第三方 Rest API 以用于 Google 上的操作

Posted

技术标签:

【中文标题】如何从 Firebase 函数调用第三方 Rest API 以用于 Google 上的操作【英文标题】:How do I call a third party Rest API from Firebase function for Actions on Google 【发布时间】:2018-11-05 09:07:05 【问题描述】:

我正在尝试从 Firebase 函数调用一个 rest API,该函数作为 Google Actions 的实现。

我尝试了以下方法:

const  dialogflow  = require('actions-on-google');
const functions = require('firebase-functions');
const http  = require('https');
const host = 'wwws.example.com';

const app = dialogflow(debug: true);

app.intent('my_intent_1', (conv, param1) => 

         // Call the rate API
        callApi(param1).then((output) => 
            console.log(output);
            conv.close(`I found $output.length items!`); 
        ).catch(() => 
            conv.close('Error occurred while trying to get vehicles. Please try again later.'); 
        );

);

function callApi (param1) 
    return new Promise((resolve, reject) => 
        // Create the path for the HTTP request to get the vehicle
        let path = '/api/' + encodeURIComponent(param1);
        console.log('API Request: ' + host + path);


        // Make the HTTP request to get the vehicle
        http.get(host: host, path: path, (res) => 
            let body = ''; // var to store the response chunks
            res.on('data', (d) =>  body += d; ); // store each response chunk
            res.on('end', () => 
                // After all the data has been received parse the JSON for desired data
                let response = JSON.parse(body);
                let output = ;

                //copy required response attributes to output here

                console.log(response.length.toString());
                resolve(output);
            );
            res.on('error', (error) => 
                console.log(`Error calling the API: $error`)
                reject();
            );
        ); //http.get
    );     //promise


exports.myFunction = functions.https.onRequest(app);

这几乎可以工作了。调用 API,我取回数据。问题是,如果没有 async/await,该函数不会等待“callApi”完成,并且我从 Actions on Google 收到一个错误,即没有响应。出错后,我可以在 Firebase 日志中看到 console.log 输出,所以一切正常,只是不同步。

我尝试使用 async/await 但出现错误,我认为这是因为 Firebase 使用了不支持异步的旧版本 node.js。

我该如何解决这个问题?

【问题讨论】:

承诺。 then 完美运行。 【参考方案1】:

您的函数callApi 返回一个promise,但您没有在您的intent 处理程序中返回一个promise。您应该确保添加 return 以便处理程序知道等待响应。

app.intent('my_intent_1', (conv, param1) => 
     // Call the rate API
    return callApi(param1).then((output) => 
        console.log(output);
        conv.close(`I found $output.length items!`); 
    ).catch(() => 
        conv.close('Error occurred while trying to get vehicles. Please try again later.'); 
    );
);

【讨论】:

以上是关于如何从 Firebase 函数调用第三方 Rest API 以用于 Google 上的操作的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase Cloud 函数中调用导出的 https Firebase Cloud 函数?

如何以安全的方式从 Cloud Tasks 调用 Firebase 函数?

如何在 Vue3 中为 Firebase 调用云函数

如何将 Firebase 与 Spring Boot REST 应用程序一起使用?

如何在没有 Firebase SDK(即通过 REST)的情况下生成 FCM 注册令牌?

如何直接从您的 Angular 项目中调用 Firebase Cloud Function