Firebase云函数HTTP触发报Cannot POST错误求助
解决Firebase Cloud Functions HTTP触发404及Firestore未更新问题
核心问题分析
- 未导出Express应用作为HTTP函数:你的代码创建了Express路由,但没有将其注册为Firebase的HTTP触发函数。这就是模拟器显示函数执行,但实际路由逻辑(包括日志、Firestore操作)都未运行,Postman返回404的根本原因。
- 成功分支缺少响应:当用户文档存在并完成更新后,未向客户端发送响应,会导致请求异常挂起。
- 日志语句语法错误:存在一个缺少参数的
console.log,会引发语法错误中断代码执行。
修正后的完整代码
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); // upload each landbot consultation to users' firestore collection const express = require('express'); const app = express(); app.use(express.json()); app.post('/uploadConsultation', async(req,res) => { try{ const consultationData = req.body; // Log the contents of the JSON file landbot has sent console.log('JSON Package sent from Landbot:', consultationData); // Identify the location of the "users" firestore collection const firestore = admin.firestore(); const usersCollection = firestore.collection('users'); // Extract userid and make a variable out of userid and another out of the remaining consultation data const {userid, ...consultation} = consultationData; // 校验userid是否存在,避免空值导致Firestore操作失败 if (!userid) { console.log('Missing userid in request body'); return res.status(400).send('userid is required'); } // Check if users collection contains a document with the specified userid const userDocRef = usersCollection.doc(userid); const userDocSnapshot = await userDocRef.get(); if (userDocSnapshot.exists) { // If the user id doc exists, add the remaining consultation data as a map field await userDocRef.update({consultation: consultationData}); console.log('Added consultation data to user collection document:', userid); // 发送成功响应,结束请求 res.status(200).send('Consultation data uploaded successfully'); } else { // If user id doc doesn't exist, show error message console.log('There is no document in the users collection with that userid:', userid); res.status(422).send('No user exists with this userid'); } } catch(error) { //handle errors using logs and sending error responses to landbot console.error('Error uploading consultation data:', error); res.status(500).send('Error uploading consultation data to firestore'); } }); // 关键:将Express应用导出为Firebase HTTP触发函数 exports.uploadConsultation = functions.https.onRequest(app);
额外优化说明
- 新增
userid非空校验,提前拦截无效请求 - 错误日志补充具体错误信息,便于排查问题
- 修复日志语句的语法错误,补充userid参数便于定位操作对象
验证步骤
- 重启本地模拟器:执行
firebase emulators:start - 使用Postman请求指定URL:
http://127.0.0.1:5001/uche-hq/us-central1/uploadConsultation - 查看模拟器日志,此时应能看到自定义日志输出,同时Firestore文档会按预期更新
内容的提问来源于stack exchange,提问作者auchegbu
相关产品推荐
相关产品推荐

