在Nuxt.js项目中,Server Middleware运行在Node服务端,可以用来处理自定义接口逻辑。当客户端以XML格式提交数据时,默认的配置并不会自动把请求体解析成可用对象,需要我们手动读取流并解析。

为什么默认收不到XML
Nuxt.js基于Connect或Express风格的Server Middleware,内部常用body-parser之类的模块,而它默认只处理application/json和urlencoded。如果请求头是text/xml或application/xml,req.body通常是空的,必须自行接收原始数据流。
使用原生Node流接收XML
最基础的做法是监听req的data和end事件,把Buffer拼起来后再做解析。下面以纯Node方式演示:
// nuxt.config.js 中配置 serverMiddleware
// middleware/xmlEcho.js
const xml2js = require('xml2js')
module.exports = function (req, res, next) {
// 只处理 xml 类型
if (!/xml/.test(req.headers['content-type'])) {
return next()
}
let raw = ''
req.on('data', chunk => {
raw += chunk.toString('utf8')
})
req.on('end', () => {
xml2js.parseString(raw, (err, result) => {
if (err) {
res.statusCode = 400
res.end('XML parse error')
return
}
res.setHeader('Content-Type', 'application/json')
res.end(JSON.stringify({ ok: true, data: result }))
})
})
}
在nuxt.config.js里注册:
export default {
serverMiddleware: [
{ path: '/api/xml', handler: '~/middleware/xmlEcho.js' }
]
}
借助body-parser的text类型
如果不想手写流,也可以用body-parser把xml当纯文本收下来,再自行解析:
const bodyParser = require('body-parser')
const xml2js = require('xml2js')
module.exports = bodyParser.text({ type: ['text/xml', 'application/xml'] })
// 在真正的处理逻辑前加一个解析中间件
// xmlHandler.js
module.exports = function (req, res, next) {
xml2js.parseString(req.body, (err, result) => {
if (err) return next(err)
req.xml = result
next()
})
}
注意事项
- 客户端必须正确设置Content-Type为xml相关类型,否则会被跳过。
- 大文件场景要注意流的内存占用,可改用流式解析库。
- 收到数据后建议使用成熟库解析,避免自己写正则处理XML。
通过上述方式,Nuxt.js的Server Middleware就能稳定接收并解析XML数据,方便与老系统或第三方服务对接。
Nuxt.jsServer_MiddlewareXML修改时间:2026-07-31 01:51:16