适用于Firebase的云功能:如何向我的Cloud Endpoint发出请求

jaz*_*gil 5 node.js firebase google-cloud-endpoints google-cloud-functions

我正在尝试在firebase数据库中写入某个值时向我的云端点项目发出请求.我找不到任何如何在Node.js中对端点执行请求的示例.这是我到目前为止所提出的:

"use strict";
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const gapi = require('googleapis');

admin.initializeApp(functions.config().firebase);

exports.doCalc = functions.database.ref('/users/{uid}/calc').onWrite(event => {
    return gapi.client.init({
            'apiKey': 'AIzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
            'clientId': '1234567890-xxx.apps.googleusercontent.com',
            'scope': 'donno what to put here'
       }).then(function() {
           return gapi.client.request({
               'path': 'https://myproj.appspot.com/_ah/api/myApi/v1',
               'params': {'query': 'startCalc', uid: event.params.uid }
           })
       }).then(function(response) {
           console.log(response.result);
       }, function(reason) {
           console.log('Error: ' + reason.result.error.message);
       });
});
Run Code Online (Sandbox Code Playgroud)

触发后,功能的日志喷口:TypeError: Cannot read property 'init' of undefined.即甚至不认识gapi.client.

首先,用于此请求的正确包装是什么?googleapis?请求承诺?

第二,我是否为端点调用设置了正确的路径和参数?假设端点功能是startCalc(int uid).

jaz*_*gil 7

更新

Cloud Functions for Firebase似乎阻止了对其App Engine服务的请求 - 至少在Spark计划中(即使它们都归谷歌所有 - 所以你假设" 在同一网络上 ").下面的请求,工作运行Node.js的本地机器上,但失败的功能服务器上,有getaddrinfo EAI_AGAIN错误,如所描述这里.显然,当您向运行在Google App Engine上的服务器发出请求时,不会将其视为访问Google API.

无法解释为什么Firebase这里的倡导者会像火一样避开这个问题.

原始答案

想出来 - 切换到'request-promise'库:

"use strict";
const functions = require('firebase-functions');
const request = require('request-promise');
const admin = require('firebase-admin');

admin.initializeApp(functions.config().firebase);

exports.doCalc = functions.database.ref('/users/{uid}/calc').onWrite(event => {
    return request({
        url: `https://myproj.appspot.com/_ah/api/myApi/v1/startCalc/${event.params.uid}`,
        method: 'POST'
    }).then(function(resp) {
        console.log(resp);
    }).catch(function(error) {
        console.log(error.message);
    });
});
Run Code Online (Sandbox Code Playgroud)