【发布时间】:2020-03-25 07:48:15
【问题描述】:
已经编写了一个除了以下之外可以正常工作的函数:
期望的行为:将从 axios GET 调用收到的
response.data保存回 Firebase 数据库具体问题:数据未保存到 Firebase 和 函数以状态码终止:500 错误
- 代码:以下代码是函数的sn-p,行 不工作的是 .update(response.data)
控制台输出状态码:500 和k, posID, name 值:
代码(编辑:根据提供的 cmets 包含整个函数):
exports.doshiiMenuUpdatedWebhook = functions.https.onRequest((req, res) => {
// Forbidding PUT requests.
if (req.method === 'PUT') {
return res.status(403).send('Forbidden!');
}
cors(req, res, () => {
let verify = req.query.verify;
let locationId = req.body.data.locationId
let posId = req.body.data.posId
let type = req.body.data.type
let uri = req.body.data.uri
let itemUri = req.body.data.itemUri
var token = jwttoken();
const options = {
headers: {'authorization': 'Bearer ' + token}
};
switch (type) {
case 'products':
console.log('Event - specific menu item updated');
console.log('jwt: ', token);
axios.get(itemUri, options)
.then(response => {
console.log('response status: ', response.status);
console.log('response statusText: ', response.statusText);
return admin.database().ref(`/venue-menus/${locationId}/products`)
.once('value').then((snapshot) => {
var products = snapshot.val();
var keys = Object.keys(products);
for (var i = 0; i < keys.length; i++){
var k = keys[i];
var name = products[k].name;
var posID = products[k].posId;
if (posID === posId){
console.log(k, posID, name);
admin.database().ref(`/venue-menus/${locationId}/products/${key}/`).update(response.data);
}//end if
}//end for
return snapshot
});
})
.then(response => {
return res.status(200).send(type)
})
.catch(err => {
return res.status(500).send({error: err})
})//end axios
break;
case 'options':
console.log('Event - specific menu option updated');
console.log('jwt: ', token);
break;
case 'surcounts':
console.log('Event - specific menu surcount updated');
console.log('jwt: ', token);
break;
default:
console.log('Event - entire menu updated');
console.log('jwt: ', token);
axios.get(uri, options)
.then(response => {
console.log('response status: ', response.status);
console.log('response statusText: ', response.statusText);
return admin.database().ref(`/venue-menus/${locationId}/`).set(response.data)
})
.then(response => {
return res.status(200).send(type)
})
.catch(err => {
return res.status(500).send({error: err})
})//end axios
}//end switch
})//end cors
});
【问题讨论】:
-
这里的代码太少,无法说明发生了什么。请编辑问题以显示以您描述的方式失败的最小完整云功能部署。我要指出的是,您根本没有处理调用 update() 的错误。请阅读:stackoverflow.com/help/minimal-reproducible-example
-
已更新问题以包含整个功能。让我指出,
switch语句的default部分中的.set()调用非常有效。
标签: javascript node.js firebase-realtime-database google-cloud-functions