在Firebase Cloud Function数据库触发器中发出PUT请求

时间:2018-01-28 02:28:22

标签: javascript node.js api firebase google-cloud-functions

我想在服务器的数据库和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)
    })
}

1 个答案:

答案 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中的返回可能是多余的,但在您需要使用它时返回有用的东西是一种好习惯。