我正在使用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然后将用户数据保存在其他节点中。
第二,当我尝试使用邮递员或以任何方式提出请求时,我收到此错误
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
}
}
答案 0 :(得分:0)
我相信您的parseInt
未能将eventSnapshot强制转换为导致出现的NaN无法存储在Firebase中的数字。我会调查一下eventSnapshot是什么。根据{{3}},您收到的对象会导致您遇到的问题。
开发人员提供的函数,它将传递存储在此位置的当前数据(作为JavaScript对象)。该函数应该返回它想要写的新值(作为JavaScript对象)。如果返回undefined(即,您返回时没有参数),则将中止事务,并且不会修改此位置的数据。
我不清楚您是否收到Firebase Docs,名称eventSnapshot
让我觉得您是。如果是这种情况,则需要调用.val()
来获取JavaScript值。
如果这不起作用,请告诉我,我会尝试在我的最后复制它。