我想在服务器的数据库和Firebase实时数据库之间同步数据。
第一部分完成,从我的服务器同步到Firebase。另一部分是遗失的部分:从Firebase到我的服务器。
我正在尝试使用数据库触发器编写Firebase云功能(在这种情况下是对表的更新),但我不知道此刻我做错了什么。在这段代码中,Lint显示了这个Each then() should return a value or throw (promise/always-return)
,但我不知道我应该把它放在哪里。
const functions = require('firebase-functions');
const axios = require('axios');
exports.syncUserAvailability = functions.database
.ref('/users/{userId}')
.onUpdate(event => {
const user = event.data.val()
updateUserIntoBackend(user.user_id, user.online)
})
function updateUserIntoBackend(userId, bool) {
promise = axios.put(
'http://MY_SERVER_IP/users/' + userId,
{
'online' : bool
},
{
'headers' : {
'Accept' : 'application/json',
'Content-Type' : 'application/json',
'Authorization' : 'Bearer ' + someToken
}
})
.then(function(response) {
console.log(response.data)
})
}
答案 0 :(得分:1)
如果你想要其他任何使用承诺解决/拒绝的东西,应该总是从函数返回Promise。如果你没有回复使用其他东西的承诺,你为什么要使用诺言?
假设您有一个解决承诺的功能:
function somePromise(){
Promise.resolve('yay')
}
如果您没有退回承诺,那么这将失败。
somePromise().then(yay => console.log(yay)
那会尝试在.then
上运行undefined
函数(这是未定义函数的返回值)。因此,您必须返回附加了.then
函数的承诺。
function somePromise(){
return Promise.resolve('yay')
}
您的代码可能会产生错误,但由于您未在onUpdate
中返回承诺,因此firebase触发器无法等待承诺得到解决。
exports.syncUserAvailability = functions.database
.ref('/users/{userId}')
.onUpdate(event => {
const user = event.data.val()
return updateUserIntoBackend(user.user_id, user.online)
})
对于updateUserIntoBackend
,必须从函数返回promise链,以便onUpdate
事件函数可以等待该promise的解析。
function updateUserIntoBackend(userId, bool) {
return axios.put(
'http://MY_SERVER_IP/users/' + userId,
{
'online' : bool
},
{
'headers' : {
'Accept' : 'application/json',
'Content-Type' : 'application/json',
'Authorization' : 'Bearer ' + someToken
}
})
.then(function(response) {
console.log(response.data)
return response
})
}
在这种情况下,最终.then
中的返回可能是多余的,但在您需要使用它时返回有用的东西是一种好习惯。