如何在Azure Functions Node.js中从请求体提取对象?
Azure Function Worker 读取复杂请求体对象的方法
问题场景
现有Azure Function Worker代码如下:
import { app, HttpRequest, HttpResponseInit, InvocationContext, } from "@azure/functions"; export async function workerfunction( request: HttpRequest, context: InvocationContext ): Promise<HttpResponseInit> { context.log(`Http function processed request for url "${request.url}"`); context.log("request.body: ", request.body); }
在Azure门户测试时,传入的请求体为:
{"body":"this is a test message"}
但日志打印结果显示request.body是一个已关闭的可读流对象,无法直接获取内容:
2023-08-02T06:49:19Z [Information] request.body: ReadableStream { locked: true, state: 'closed', supportsBYOB: false }
解决方案
要读取请求体中的复杂对象,需要将ReadableStream转换为可处理的JSON对象,以下是两种常用方法:
方法一:使用内置request.json()方法(推荐)
HttpRequest对象提供了json()异步方法,可直接将请求体解析为JSON对象,无需手动处理流:
import { app, HttpRequest, HttpResponseInit, InvocationContext, } from "@azure/functions"; export async function workerfunction( request: HttpRequest, context: InvocationContext ): Promise<HttpResponseInit> { context.log(`Http function processed request for url "${request.url}"`); // 直接解析请求体为JSON对象 const requestBody = await request.json(); context.log("解析后的请求体: ", requestBody); // 可直接访问复杂对象的嵌套属性,例如 requestBody.body 或其他层级属性 // 示例:处理复杂对象中的嵌套字段 if (requestBody.nested?.data) { context.log("嵌套字段内容: ", requestBody.nested.data); } return { body: "请求体解析完成" }; }
方法二:手动读取流并解析JSON
如果需要更灵活的处理逻辑(比如先验证原始内容),可以手动读取流文本再解析:
import { app, HttpRequest, HttpResponseInit, InvocationContext, } from "@azure/functions"; export async function workerfunction( request: HttpRequest, context: InvocationContext ): Promise<HttpResponseInit> { context.log(`Http function processed request for url "${request.url}"`); try { // 将可读流转换为原始文本 const rawBody = await request.text(); // 解析为JSON对象 const requestBody = JSON.parse(rawBody); context.log("解析后的请求体: ", requestBody); } catch (error) { context.error("请求体解析失败: ", error); return { status: 400, body: "无效的JSON格式请求体" }; } return { body: "请求体解析完成" }; }
关键注意事项
- 确保请求的
Content-Type请求头设置为application/json,否则解析可能失败 - 对于格式不确定的请求体,建议添加
try-catch异常处理,避免函数因解析错误崩溃
内容的提问来源于stack exchange,提问作者Kid_Learning_C
相关产品推荐
相关产品推荐

