Firebase 的触发器功能不起作用

Trigger Functions for Firebase does not work

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

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

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

相反,您应该仅在提取完成后更新数据库。为了使它更容易,您可能想要研究使用 request-promise 模块来发出一个请求,该请求 return 是一个包含结果的承诺,然后链接一个 then() 方法来执行更新。

您仍然需要 return 只有在 所有 异步工作在您的函数中完成后才解决的承诺。

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

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

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

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