0

0

Nuxt.js Server Middleware如何接收XML数据

畫卷琴夢

畫卷琴夢

发布时间:2026-02-21 09:07:03

|

993人浏览过

|

来源于php中文网

原创

nuxt.js 的 servermiddleware 默认不解析 xml,需手动读取原始请求流并用 fast-xml-parser 解析;nitro 下推荐使用 readrawbody,nuxt 2 则需监听 data/end 事件。

nuxt.js server middleware如何接收xml数据

Server Middleware 默认不解析 XML

Nuxt.jsserverMiddleware 运行在 Node.js 服务端(如 nitro 或旧版 connect),但默认只自动解析 application/jsonapplication/x-www-form-urlencoded,对 application/xmltext/xml 完全忽略 —— 所以你直接读 req.body 会是 undefined

必须手动读取原始请求流并解析 XML

你需要:① 阻止 body-parser 提前消费流(尤其在 Nitro 环境下);② 用 stream.Readable 读取原始 req;③ 选一个轻量 XML 解析器。推荐用 fast-xml-parser(无依赖、支持流式 buffer 输入)。

  • 安装:npm install fast-xml-parser
  • Nitro 中需禁用默认解析:在 serverMiddleware 函数开头加 req.rawBody = true(仅 Nitro 有效)或手动接管流
  • 注意:不能在中间件里调用 req.pipe() 多次,流只能消费一次
import { XMLParser } from 'fast-xml-parser';

export default defineEventHandler(async (event) => {
  const contentType = event.req.headers['content-type'] || '';
  if (!contentType.includes('xml')) {
    return createError({ statusCode: 400, statusMessage: 'Content-Type must be XML' });
  }

  // 读取原始 body
  const rawBody = await readRawBody(event);
  
  try {
    const parser = new XMLParser({ ignoreAttributes: false, ignoreDeclaration: true });
    const result = parser.parse(rawBody);
    event.context.xmlPayload = result;
  } catch (e) {
    return createError({ statusCode: 400, statusMessage: 'Invalid XML' });
  }
});

readRawBody 是 Nitro 提供的安全读取方式

在 Nuxt 3 + Nitro 下,readRawBody(event) 是唯一推荐的原始体读取方法。它已处理了编码、超时、大小限制等边界问题。不要用 req.on('data') 手动拼接 —— 容易丢数据或阻塞事件循环。

科大讯飞-AI虚拟主播
科大讯飞-AI虚拟主播

科大讯飞推出的移动互联网智能交互平台,为开发者免费提供:涵盖语音能力增强型SDK,一站式人机智能语音交互解决方案,专业全面的移动应用分析;

下载
  • readRawBody 返回 Promise<string buffer></string>,默认返回字符串;传 { encoding: null } 可得 Buffer
  • 若 XML 含非 UTF-8 编码(如 ISO-8859-1),需先按对应编码解码 Buffer,再传给 XML 解析器
  • Nitro 默认限制 body 最大为 1MB,如需更大,改 nitro.config.ts 中的 runtimeConfig.bodySizeLimit

兼容旧版 Nuxt 2(Express/Connect 中间件)

如果你还在用 Nuxt 2,serverMiddleware 是标准 Express 中间件函数,需手动监听 dataend 事件:

const { XMLParser } = require('fast-xml-parser');

export default function xmlMiddleware(req, res, next) {
  if (!req.headers['content-type']?.includes('xml')) return next();

  let data = '';
  req.setEncoding('utf8');
  req.on('data', chunk => { data += chunk; });
  req.on('end', () => {
    try {
      const parser = new XMLParser();
      req.xmlBody = parser.parse(data);
      next();
    } catch (e) {
      res.status(400).json({ error: 'Invalid XML' });
    }
  });
}

注意:这里没做流错误监听(req.on('error')),线上必须补上,否则连接异常会导致请求挂起。

XML 解析本身不难,真正容易出问题的是流控制时机和编码一致性 —— 特别是当客户端发来带 BOM 的 UTF-8 XML 或混合编码声明时,fast-xml-parser 默认不处理 BOM,需要提前 strip。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

180

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

224

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

443

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

322

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

Node.js后端开发与Express框架实践
Node.js后端开发与Express框架实践

本专题针对初中级 Node.js 开发者,系统讲解如何使用 Express 框架搭建高性能后端服务。内容包括路由设计、中间件开发、数据库集成、API 安全与异常处理,以及 RESTful API 的设计与优化。通过实际项目演示,帮助开发者快速掌握 Node.js 后端开发流程。

175

2026.02.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

790

2023.08.02

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

796

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 9.4万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号