nodejs网络.createServer函数将导致一个空服务器.地址值在Bluemix



net模块有一个createServer函数,允许您创建网络包装器。这在Nodejs的本地运行时很好,但在Bluemix中运行时,它无法确定主机地址。服务器似乎被创建,但进一步检查后,我找到了服务器。地址为空

var tls = require('tls');
var fs = require('fs');
var net = require('net');
var tunnelHost = (process.env.VCAP_APP_HOST || 'localhost');
var tunnelPort = 8888;
var server;
var gatewayOptions = {
    host: 'http://cap-sg-prd-5.integration.ibmcloud.com/',
    port: '15133',
    key: fs.readFileSync('key.pem'),
    cert: fs.readFileSync('cert.pem'),
    ca: fs.readFileSync('ca.pem')
};
console.log("starting createSecureTunnel");
//create a server end point to use as a network wrapper for the secure gateway
server = net.createServer(function (connListener){
    console.log('net server created');
    connListener.on('end', function() {
        console.log('client disconnected');
    });
    connListener.on('uncaughtException', function(err){
        console.log('exception caught:  ' + JSON.stringify(err));
    });
    //connect to farside, local/private server
    connectFarside(connListener, function(err, remoteSocket){
        if (err){
            console.log(err);
        }
        console.log('connection made');
        remoteSocket.pipe(connListener);
        console.log('remote socket connecte to local connListener');
        connListener.pipe(remoteSocket);
        console.log('local connListener connected to remote socket');
    });
});

//setup listener for network wrapper
server.listen(tunnelPort, tunnelHost, function(){
    console.log('tunnel created at: ' + tunnelHost +":"+ tunnelPort);  //.address +":"+ server.address().port);
});
//createa a TLS connection to the secure gateway
function connectFarside(conn, callback) {
    console.log("starting connectFarside");
    try {
        console.log("initiating farside connection");
        var socket = tls.connect(gatewayOptions, function(){
            console.log("tunnel connected to " + gatewayOptions.host +":"+ gatewayOptions.port);
            callback(null, socket);
        });
        socket.on("error", function(err){
            console.log("Socket error: " + JSON.stringify(err));
        });
    } catch(err) {
        console.log(err);
        callback(err);
    }
}

Bluemix为你的应用程序提供了一个运行端口,这就是它不能在Bluemix中工作的原因。你开始在8888端口上启动你的应用程序,使用下面的代码行。

var tunnelPort = 8888;

应该改成

var tunnelPort = process.env.VCAP_APP_PORT || 8888;

上面一行将读取一个名为VCAP_PORT的环境变量,其中Bluemix为您的应用程序分配了一个端口,如果它没有运行Bluemix,它将运行在端口8888上。

您的应用程序将在端口80443上通过web访问。Bluemix将为您的应用程序实现负载平衡。

可以在监听服务器时指定服务器地址

var net = require('net')
var server = net.createServer(handler)
server.listen(port, address)

试试address = '0.0.0.0',看看是否有效

使用cf-autoconfig模块部分解决。它有助于重新配置模块,以便在Cloud Foundry平台上使用。通过将此作为应用程序的第一行,它基本上可以工作。它不使用端口号。但至少我可以访问包装器。

所以我添加了这个作为第一行

require("cf-autoconfig");

然后我换了服务器。听听这个

//setup listener for network wrapper
server.listen(tunnelPort, function(){
    console.log('tunnel created at: ' + tunnelHost +":"+ tunnelPort);  //.address +":"+ server.address().port);
});

现在,如果我使用我的应用程序名称,我可以连接到由net.createServer()创建的服务器。

我仍然想知道如何让端口工作,所以这可以在web应用程序内部使用,以提供隧道。

最新更新