Firebase功能事务失败:数据在属性中返回Nan

时间:2018-04-15 19:46:36

标签: javascript firebase firebase-realtime-database google-cloud-functions

我正在使用firebase功能,而且我每次都会通过身体发送的请求尝试更新/增加值。 这是我在firebase中的节点

     "global-counters": {
    "1": "0",
    "2": "0",
    "3": "0"
  },

这是我编写的函数

    const functions = require('firebase-functions');

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

let answers = { '1': 0, '2': 0, '3': 0 }

exports.tryGetCount = functions.https.onRequest((req, res) => {
    console.log(`req method ${req.method}`)    
    let userAnswer = req.body.answer;
    console.log(`user answer is ${userAnswer}`)
    let userInformation = req.body.userInfo;
    if (answers.hasOwnProperty(userAnswer)) {
         admin.database().ref('/global-counters').child(userAnswer).transaction(eventSnapshot => {
            let parseAnswer = parseInt(eventSnapshot)
            eventSnapshot = parseAnswer +1; // here i want to increment the value
            return eventSnapshot;
        }).then((e) => {
            return admin.database().ref('/questionsTest').child(userInformation.uid).set(userInformation).then((snapshot) => {
                return res.send({ snapshot: snapshot, answers:e})
            }).catch((e)=>{
                return res.status(400).json({error:e})
            })
        }).catch((e) => {
            return res.status(400).json({ error: e });
        })
    } else {
        return res.status(400).json({ error: 'invalid property user answer' })
    }
});

我发布的http请求

{
        "answer":"3",
        "userInfo":{
            "uid":"1239",
            "gid": "1",
            "qid":"2",
            "aid":"3"
        }
    }

我想要做的是,例如用户发送

'answer':'3' 

所以我想增加+1指数' 3'进入firebase然后将用户数据保存在其他节点中。

我遇到的一些问题: 首先我在函数日志中得到错误 enter image description here

第二,当我尝试使用邮递员或以任何方式提出请求时,我收到此错误

Error: could not handle the request

当我以这种方式改变功能时

exports.tryGetCount = functions.https.onRequest((req, res) => {
    console.log(`req method ${req.method}`)  
    console.info(req.body)  
    let userAnswer = req.body.answer;
    console.log(`user answer is ${userAnswer}`)
    console.log(`typeof is`,typeof userAnswer) // i get "type of string"
    let userInformation = req.body.userInfo;
    if (answers.hasOwnProperty(userAnswer)) {
         return admin.database().ref(`/global-counters/${userAnswer}`).transaction(eventSnapshot => {
            console.info(`event snapshot ${eventSnapshot}`)
            let parseAnswer = parseInt(eventSnapshot);
            eventSnapshot = parseAnswer +1;
            return eventSnapshot;
        }).then((e) => {
            return admin.database().ref('/questionsTest').child(userInformation.uid).set(userInformation).then((snapshot) => {
                return res.send({ snapshot: snapshot, answers:e})
            }).catch((e)=>{
                return res.status(400).json({error:e})
            })
        }).catch((e) => {
            return res.status(400).json({ error: e });
        })
    } else {
        return res.status(400).json({ error: 'invalid property user answer' })
    }
});

所以这种方式交替运作。例如,我通过邮递员运行它,4个中的3个,它不起作用它显示错误

  

错误:无法处理请求

我最后一次尝试,它可以工作并返回

{
"answers": {
    "committed": true,
    "snapshot": 4
}

}

1 个答案:

答案 0 :(得分:0)

我相信您的parseInt未能将eventSnapshot强制转换为导致出现的NaN无法存储在Firebase中的数字。我会调查一下eventSnapshot是什么。根据{{​​3}},您收到的对象会导致您遇到的问题。

  

开发人员提供的函数,它将传递存储在此位置的当前数据(作为JavaScript对象)。该函数应该返回它想要写的新值(作为JavaScript对象)。如果返回undefined(即,您返回时没有参数),则将中止事务,并且不会修改此位置的数据。

我不清楚您是否收到Firebase Docs,名称eventSnapshot让我觉得您是。如果是这种情况,则需要调用.val()来获取JavaScript值。

如果这不起作用,请告诉我,我会尝试在我的最后复制它。