【问题标题】:Firebase function transaction failed: data returned Nan in propertyFirebase 函数事务失败:数据在属性中返回 Nan
【发布时间】:2018-04-15 19:46:35
【问题描述】:

我正在使用 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' })
    }
});

这就是我做的 post http 请求

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

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

'answer':'3' 

所以我想将索引“3”增加 +1 到 firebase,然后将用户数据保存在其他节点中。

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

其次,当我尝试使用邮递员或任何方式发出请求时,我收到此错误

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
}

}

【问题讨论】:

  • console.info(event snapshot ${eventSnapshot}) 注销什么?
  • 有时它显示我正在寻找的特定键的当前值,有时它为空。当它发生时我拍了这个屏幕视频,如果有什么方法可以分享,我很乐意这样做

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


【解决方案1】:

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

一个开发者提供的函数,它将传递存储在这个位置的当前数据(作为一个 JavaScript 对象)。该函数应该返回它想要写入的新值(作为 JavaScript 对象)。如果返回 undefined(即不带参数返回),事务将被中止,并且该位置的数据不会被修改。

我不清楚你是否收到DataSnapshoteventSnapshot 这个名字让我觉得你是。如果是这种情况,您需要调用 .val() 来获取 JavaScript 值。

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

【讨论】:

  • 我尝试制作 eventsnapshot.val() 但我在 Object.admin.database.ref.child.transaction.eventSnapshot [as update] ( /user_code/index.js:16:57) 在 Repo_1.Repo.startTransaction
  • 当我 console.info(eventSnapshot) 我得到 null.. 我做错什么了吗?
  • 有趣,这意味着该子/事务调用的结果不是您所期望的。所以parseInt 返回一个 NaN 是有道理的。
  • 是的,但它交替发生..有时 ut 返回数字,请求工作正常,但有时不能返回 Nan.. 具有相同的正文参数!
  • 嗯,我会检查以确保您的数据结构在成功执行此函数后看起来正确。换句话说,请确保您正在保存您希望保存的内容。您还可以实现一个检查,如果值为空,第一次看到它,设置值等于 1。
猜你喜欢
  • 2019-03-08
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2019-05-15
  • 1970-01-01
  • 2021-07-21
相关资源
最近更新 更多