node-soap - 如何在soap侦听器处理soap请求之前捕获它

时间:2017-06-14 06:02:07

标签: node.js xml soap wsdl node-soap

我使用node-soap模块在​​nodejs中创建了一个soap服务器。但是我收到一个错误,表明传入的soap xml中存在一些问题(如下所示)。

  

<肥皂日志:{故障:< {faultcode:500,< faultstring:   '无效的XML',< detail:'错误:首先是非空格   标签。\ nLine:1 \ nColumn:1 \ nChar: - ',< statusCode:undefined}}

当我在谷歌搜索时,它表明这是Windows操作系统插入到unicode缓冲区的BOM(字节顺序标记)的问题。大多数解决方案建议在调用xml解析器之前替换/删除此BOM。

enter image description here

现在,当我使用node-soap模块时,我无法确定应用此修复程序的位置,下面是我的服务器代码。

/**
 * Simple demonstration of soap service
 **/

var soapService = require("./rv.js");

var xml = require('fs').readFileSync('./mmsxmlpushservicews.wsdl.xml', 'utf8');
var express = require('express');
var bodyParser = require('body-parser');
var soap = require('soap');

var app = express();
app.use(bodyParser.raw({type: function() { return true; }, limit: '5mb' }));
app.listen(8001, function(err) {
  if (err) {
    console.error("error:", err);
    process.exit(1);
  }

  var server = soap.listen(app, '/smshttp/soapws', soapService, xml); 
  server.log = function(type, data) {
    //console.log("soap log:", data);
  }
  console.log("service running on port 8001...");
});
  • 在上面的soap服务器代码中,是否有一个事件/回调挂钩,我可以在soap服务器执行解析之前修改soap请求缓冲区?
  • 如果是,我应该在哪里以及如何做?

1 个答案:

答案 0 :(得分:0)

在此行之后将此行添加到您的代码中#app.use(bodyParser.raw({type:function(){return true;},limit:' 5mb'}));& #39;

app.use(function(req, res, next) {
    var body = req.body.toString();
    var body = body.replace('\ufeff', '');
    req.body = Buffer.from(body);
    next();
});

此快速挂钩允许您处理每个请求,评估已调用的网址,并使用' next()'安全地转发到下一位听众。

但是考虑到每个请求都会调用此函数,所以不要忘记只过滤那些需要清理字符串的函数。