Javascript Firebase的触发器功能不起作用

Javascript Firebase的触发器功能不起作用,javascript,firebase,google-cloud-functions,firebase-admin,Javascript,Firebase,Google Cloud Functions,Firebase Admin,我想使用Firebase云函数通过触发器从外部url获取数据。但是,获取数据和更新特定节点不起作用 怎么了?我的Firebase计划是Blaze 功能错误: 数据库错误: 外部数据结构-JSON { "results": [ { "details_a": "15+ Heavy duty truck comprising of T800 ...", "equipment_id": "ChIJW6AIkVXemwARTtIvZ2xC3FA" } ],

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

怎么了?我的Firebase计划是Blaze

功能错误

数据库错误

外部数据结构-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()
是异步的,这意味着函数在结果可用之前返回。稍后将调用您提供的回调,并显示结果。由于函数立即返回,这意味着您函数的最后一行(返回语句)将在调用回调之前执行。尝试将日志语句放入代码的每个部分,以查看实际调用的顺序

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

相反,您应该仅在获取完成后更新数据库。为了简化操作,您可能需要研究使用request promise模块来发出一个请求,该请求返回一个包含结果的承诺,然后将
then()
方法链接到该请求之外以执行更新

您仍然必须返回一个承诺,该承诺只有在函数中的所有异步工作完成后才能得到解决

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

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

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

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

相反,您应该仅在获取完成后更新数据库。为了简化操作,您可能需要研究使用request promise模块来发出一个请求,该请求返回一个包含结果的承诺,然后将
then()
方法链接到该请求之外以执行更新

您仍然必须返回一个承诺,该承诺只有在函数中的所有异步工作完成后才能得到解决

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

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文档

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

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

您还可以查看firestore文档

,因为它抱怨
结果
字段是
未定义的
,所以记录整个响应并查看发生的情况可能会很有用。请不要在问题中显示错误和代码的图片。最好将文本复制并粘贴到问题中的代码块中,这样更易于阅读和搜索。由于它抱怨
结果
字段
未定义
,因此可能需要记录整个响应并查看发生了什么。请不要在问题中显示错误和代码的图片。最好是将文本复制并粘贴到问题的代码块中,这样更易于阅读和搜索。这是结果
TypeError:request.get(…)。然后不是函数
其他结果:
响应:{'content type':'application/json;charset=UTF-8',date:'Tue,2018年3月6日04:04:34 GMT',expires:'Wed,2018年3月7日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”,“接受范围”:“无”,变为:“接受语言,接受编码”,连接:}
我已经按照您的建议进行了。这是结果
TypeError:request.get(…)。则不是函数
其他结果:
响应:{'content type':'application/json;charset=UTF-8',date:'Tue,2018年3月6日04:04:34 GMT',expires:'Wed,2018年3月7日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”,“接受范围”:“无”,变为:“接受语言,接受编码”,连接:“关闭”