Javascript Firebase的触发器功能不起作用
我想使用Firebase云函数通过触发器从外部url获取数据。但是,获取数据和更新特定节点不起作用 怎么了?我的Firebase计划是Blaze 功能错误: 数据库错误: 外部数据结构-JSONJavascript 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" } ],
{
"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()
之后立即调用Firebaseupdate
方法,但在其结果可用之前,这意味着每次details
都包含一个空字符串。那绝对不是你想要的
相反,您应该仅在获取完成后更新数据库。为了简化操作,您可能需要研究使用request promise模块来发出一个请求,该请求返回一个包含结果的承诺,然后将then()
方法链接到该请求之外以执行更新
您仍然必须返回一个承诺,该承诺只有在函数中的所有异步工作完成后才能得到解决
还有一个问题。这行代码似乎没有任何作用:
res.status(200).end('OK');
这看起来像是HTTP触发器中用来将结果发送到客户端的东西。但是你在这里写一个数据库触发器。我希望这行代码会失败,因为res
从未在代码中的任何地方定义过。request.get()
是异步的,这意味着函数在结果可用之前返回。稍后将调用您提供的回调,并显示结果。由于函数立即返回,这意味着您函数的最后一行(返回语句)将在调用回调之前执行。尝试将日志语句放入代码的每个部分,以查看实际调用的顺序
由于您在request.get()
之后立即调用Firebaseupdate
方法,但在其结果可用之前,这意味着每次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”,“接受范围”:“无”,变为:“接受语言,接受编码”,连接:“关闭”