You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:01:21