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