文章目录
由于 expressjs 自带的 body-parser 默认不能解析 ‘text/xml’ 的内容,我曾考虑依照 body-parser 本身的结构自己写一个工业级的 ‘text/xml’ 解析器。后来才发现,其实可以通过调用 body-parser 的 text() 函数作为中间件,对 ‘text/xml’ 解析,只要在赋入的选项中添加 type: ‘text/xml’ 属性即可。我自己写的 ‘text/xml’ 解析器算是个副产品吧,有时间测试后也会发表,比直接调用 bodyParser.text() 在功能上要强一些,流程上也统一一些,安全性也高一些。现有的软件库中我还没有看到具有类似功能的模块。
参考代码 1: expressjs 项目的入口,载入 body-parser 模块并调用 text() 中间件,如果不赋入 ‘text/xml’ 选项,text() 将默认以 ‘text/plain’ 类型执行解析,则会发生类型匹配错误,导致解析无法完成,所以 ‘text/xml’ 选项是必须手动传入的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 var express = require ('express' );var routes = require ('./routes' );var user = require ('./routes/user' );var http = require ('http' );var path = require ('path' );var bodyParser = require ('body-parser' );var app = express ();app.set ('port' , process.env .PORT || 3000 ); app.set ('views' , path.join (__dirname, 'views' )); app.set ('view engine' , 'jade' ); app.use (express.favicon ()); app.use (express.logger ('dev' )); app.use (bodyParser.text ({type : 'text/xml' })); app.use (express.json ()); app.use (express.urlencoded ()); app.use (express.methodOverride ()); app.use (app.router ); app.use (express.static (path.join (__dirname, 'public' ))); if ('development' == app.get ('env' )) { app.use (express.errorHandler ()); } app.get ('/' , routes.index ); app.get ('/users' , user.list ); http.createServer (app).listen (app.get ('port' ), function ( ){ console .log ('Express server listening on port ' + app.get ('port' )); });
参考代码 2:通过 xml2js 将解析出的 xml 字符串解析为 json ,并存入解析完成后的请求体中供其他代码调用。
1 2 3 4 5 6 7 8 9 10 11 12 {parseString} = require 'xml2js' exports .index = (req, res) -> parseString req.body, (err, result) -> if err err.status = 400 res.end 'error' return else req.body = result console.log req.body res.end 'success' return