【问题标题】:Trigger Functions for Firebase does not workFirebase 的触发功能不起作用
【发布时间】:2018-08-13 19:40:50
【问题描述】:

我想使用 Firebase 云功能通过触发器从外部 url 获取数据。但是,获取数据和更新特定节点不起作用。

怎么了?我的 Firebase 计划是 Blaze。

功能错误print screen 1

数据库错误print screen 2

外部数据结构 - JSON

{
  "results": [
    {
      "details_a": "15+ Heavy duty truck comprising of T800 ...",
      "equipment_id": "ChIJW6AIkVXemwARTtIvZ2xC3FA"
    }
  ],
  "status": "OK"
}

index.js

'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const request = require('request');
exports.setDetails = functions.database.ref('/equipment/{pushId}').onWrite((event) => {
    if (event.data.previous.exists()) { return }
    if (!event.data.exists()) { return }    
    const post = event.data.val();
    if (post.details){ return };
    const number = post.number;
    const details = '';
    request.get({
        uri: 'https://api.domain.com/json?partnumber=' + number,
        json: true,
        headers: {
          'Content-Type'   : 'application/json' ,
        }
    }, (error, response) => {
        if (error) { 
            console.error(error);
        } else { 
            details = response.results[0].details_a;
            console.log('Response: ', response.headers);
            res.status(200).end('OK');
        }
    });
    return admin.database().ref('/equipment/{pushId}').update({number: number, details: details});
});

【问题讨论】:

  • 由于它抱怨 results 字段为 undefined,因此记录整个响应并查看发生了什么可能很有用。
  • 请不要在问题中显示错误图片和代码。最好将文本复制并粘贴到问题中的代码块中,这样更易​​于阅读和搜索。

标签: javascript firebase google-cloud-functions firebase-admin


【解决方案1】:

我遇到了这个问题,我注意到我引用的是实时数据库而不是 Firestore。当我纠正这个问题时,一切都开始正常工作了。

exports.onActionsWrite = functions.firestore
    .document('/actions/{id}')
    .onWrite(event => {
        console.log('I'm here!');
        // Do something...
        return null;
    });

您也可以查看 firestore 文档 https://firebase.google.com/docs/functions/firestore-events

【讨论】:

    【解决方案2】:

    request.get() 是异步的,这意味着函数在结果可用之前返回。您提供的回调将在稍后调用结果。由于函数立即返回,这意味着函数的最后一行(return 语句)将在调用回调之前执行。尝试将日志语句放入代码的每个部分,以查看实际调用的顺序。

    由于您在 request.get() 之后立即调用 Firebase update 方法,但在其结果可用之前,这意味着 details 每次都包含一个空字符串。这绝对不是你想要的。

    相反,您应该仅在提取完成后更新数据库。为了方便起见,您可能需要考虑使用 request-promise 模块发出一个请求,该请求返回一个包含结果的 Promise,然后链接一个 then() 方法来执行更新。

    你仍然需要返回一个只有在所有异步工作在你的函数中完成之后才被解决的promise。

    还有一个问题。这行代码似乎没有做任何事情:

    res.status(200).end('OK');
    

    这看起来像是在 HTTP 触发器中用来将结果发送到客户端的东西。但是你在这里写了一个数据库触发器。我希望这行代码会失败,因为 res 从未在您的代码中的任何地方定义。

    【讨论】:

    • 我已按照您的建议进行操作。这是结果TypeError: request.get(...).then is not a function
    • 其他结果:Response: { 'content-type': 'application/json; charset=UTF-8', date: 'Tue, 06 Mar 2018 04:04:34 GMT', expires: 'Wed, 07 Mar 2018 04:04:34 GMT', 'cache-control': 'public, max-age=86400', 'access-control-allow-origin': '*', server: 'mafe', 'x-xss-protection': '1; mode=block', 'x-frame-options': 'SAMEORIGIN', 'alt-svc': 'hq=":443"; ma=2592000; quic=51303431; quic=51303339; quic=51303338; quic=51303337; quic=51303335,quic=":443"; ma=2592000; v="41,39,38,37,35"', 'accept-ranges': 'none', vary: 'Accept-Language,Accept-Encoding', connection: 'close' }
    猜你喜欢
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多