Node.js中如何在SOAP服务内部获取客户端IP地址?
获取SOAP服务的客户端IP地址
问题背景
用npm soap包搭建了SOAP服务并挂载到Express服务器上,服务器监听两个网络接口,需要判断请求来自哪个接口,计划通过客户端IP结合os.networkInterfaces()分析,但无法获取客户端IP,尝试this.req.ip、this.httpHeaders["x-forwarded-for"] || this.req.connection.remoteAddres均返回undefined。
解决方案
soap包的服务方法默认提供第四个参数——原始HTTP请求对象req,通过它可以直接获取客户端IP。同时注意修正拼写错误:remoteAddres应为remoteAddress。
修改核心服务方法
修改soapserver.js中的checkUserName方法,接收第四个参数req并获取IP:
checkUserName: function(args, soapCallback, headers, req) { console.log('checkUserName: Entering function..'); console.log(args); // 获取客户端IP const clientIp = req.ip || req.connection.remoteAddress; console.log('客户端IP:', clientIp); // 返回符合WSDL定义的响应结构(原代码直接传字符串会导致客户端解析失败) soapCallback(null, { status: 'username found' }); }
完整修改后的soapserver.js
var soap = require('soap'); var http = require('http'); const util = require('util'); const app = require("express")() var myService = { CheckUserName_Service: { CheckUserName_Port: { checkUserName: function(args, soapCallback, headers, req) { console.log('checkUserName: Entering function..'); console.log(args); // 获取客户端IP const clientIp = req.ip || req.connection.remoteAddress; console.log('客户端IP:', clientIp); // 返回符合WSDL的响应 soapCallback(null, { status: 'username found' }); } } } }; var xml = require('fs').readFileSync('check_username.wsdl', 'utf8'); var server = require("http").Server(app); app.get('/', (req, res) => { res.send("Hello World!"); console.log(req.connection.remoteAddress); console.log(req.ip); }); var port = 8000; server.listen(port); var soapServer = soap.listen(server, '/test', myService, xml); soapServer.log = function(type, data) { console.log('Type: ' + type + ' data: ' + data); }; console.log('SOAP service listening on port ' + port);
补充说明
- 若服务器部署在反向代理之后,需在Express中添加
app.set('trust proxy', true),确保req.ip返回真实客户端IP而非代理服务器IP。 - 要判断请求来自哪个网络接口,可结合
os.networkInterfaces()返回的网卡子网信息,对比客户端IP所属网段即可确定。
内容的提问来源于stack exchange,提问作者mn Stoner
相关产品推荐
相关产品推荐

