如何在Deno Fresh中获取Node-RED POST请求的msg.payload数据
解决Deno Fresh POST处理器无法获取Node-RED请求数据的问题
问题出在你直接获取了req.body,它本身就是一个ReadableStream对象,并非实际的请求数据。要拿到Node-RED发送的msg.payload数据,需要根据请求的Content-Type选择对应的解析方法:
常见解析方式
- 如果Node-RED发送的是JSON格式数据(默认通常是这个),使用
req.json()方法解析 - 如果是表单数据或纯文本,使用
req.text()方法解析,之后可再按需转换格式
修改后的处理器代码
解析JSON数据的情况
import { Handlers, HandlerContext } from "$fresh/server.ts"; export const handler: Handlers = { async POST(req: Request, ctx: HandlerContext){ // 解析JSON格式的请求体 const payload = await req.json(); console.log(payload); // 这里就能拿到Node-RED发送的msg.payload数据了 return new Response(JSON.stringify(payload), { headers: { "Content-Type": "application/json" } }); } };
解析文本/表单数据的情况
import { Handlers, HandlerContext } from "$fresh/server.ts"; export const handler: Handlers = { async POST(req: Request, ctx: HandlerContext){ // 解析纯文本或表单格式的请求体 const payloadText = await req.text(); console.log(payloadText); // 如果是表单数据,可进一步解析:const payload = new URLSearchParams(payloadText); return new Response(payloadText); } };
额外注意事项
- 确保Node-RED的POST请求里设置了正确的
Content-Type头,比如JSON格式对应application/json,表单对应application/x-www-form-urlencoded - 如果请求体已经被读取过(比如之前调用过一次解析方法),
ReadableStream会被锁定,无法再次读取,所以要避免重复解析
内容的提问来源于stack exchange,提问作者Bill Kalaitzo
相关产品推荐
相关产品推荐

