You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:05:26