使用Express+Firestore+Cloud Functions+TS构建REST API POST读不到body
问题解决方法
核心问题原因
你遇到的POST接口无法读取请求body、title等字段为undefined的问题,是因为Express 默认没有开启JSON请求体解析能力,无法解析你POST请求里的JSON格式参数。
具体修复步骤
步骤1:添加Express JSON解析中间件
修改你的index.ts文件,在初始化express实例后、注册路由前,添加解析中间件:
// index.ts 修正后代码 import * as functions from 'firebase-functions' import * as express from 'express' import { addEntry, getAllEntries } from './entryController' const api = express() // 新增以下这行,开启JSON请求体解析 api.use(express.json()) api.get('/', (req, res) => res.status(200).send('Hey there!')) api.post('/entries', addEntry) api.get('/entries', getAllEntries) exports.api = functions.https.onRequest(api)
步骤2:修复异步操作漏await的问题
你当前代码里entry.set(entryObject)是异步IO操作,没有加await会导致接口返回响应时,数据可能还没写入Firestore,极端情况下会出现数据丢失,修改entryController.ts里的addEntry方法:
const addEntry = async (req: Request, res: Response) => { const { title, text } = req.body try { const entry = db.collection('entries').doc() const entryObject = { id: entry.id, title, text } // 新增await关键字 await entry.set(entryObject) res.status(200).send({ status: 'success', message: 'entry added successfully', data: entryObject }) } catch(error) { res.status(500).json(error.message) } }
步骤3:确认Postman请求配置正确
发送请求时需要满足两个条件:
- 请求头
Content-Type设置为application/json - Body选择
raw格式,类型选择JSON,参数按JSON格式填写,示例:
{ "title": "测试标题", "text": "测试内容", "coverImageUrl": "https://xxx.com/xxx.jpg" }
修改完成后重新部署Cloud Functions即可正常拿到请求体参数,完成新增数据操作。
内容的提问来源于stack exchange,提问作者David Griffin
相关产品推荐
相关产品推荐

