代码之家  ›  专栏  ›  技术社区  ›  R. Martinez

Firebase的触发器功能不工作

  •  1
  • R. Martinez  · 技术社区  · 8 年前

    我想使用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"
    }
    

    指数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});
    });
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   Guilherme De Jesus Rafael    7 年前

    我遇到了这个问题,我注意到我引用的是实时数据库,而不是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
  •  0
  •   Doug Stevenson    8 年前

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

    既然你打电话给消防基地 update 方法之后立即 要求获取() ,但在其结果可用之前,这意味着 details 每次都包含一个空字符串。那绝对不是你想要的。

    相反,您应该仅在提取完成后更新数据库。为了更简单,您可能希望研究使用请求承诺模块来发出一个返回包含结果的承诺的请求,然后链接 then() 方法来执行更新。

    你仍然必须回报一个只有在 全部的 异步工作在您的函数中完成。

    还有一个问题。这行代码似乎没有任何作用:

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

    这看起来像是在HTTP触发器中用来将结果发送到客户端的东西。但你在这里写一个数据库触发器。我预计这行代码会在 res 从未在代码中的任何位置定义。

    推荐文章