2015-01-29 4 views
1

나는 node.js의 초보자입니다. node.js를 사용하여 클라우드에 서버를 만들고 관리하는 webapp을 만들려고합니다. 몇 가지 연구를 한 후 nodeapp.js, socket.io, express 및 pkgcloud 모듈을 사용하여 webapp를 작성하기로 결정했습니다. 이제 내가 직면하고있는 문제는 서버를 만들 때 프런트 엔드/클라이언트쪽에 메시지를 보낼 수 없다는 것입니다. 서버가 성공적으로 생성되고 있지만 서버 상태를 브라우저 화면으로 보내는 방법을 얻지 못하고 있습니다. 하는 index.jsNode.js에서 처리기/콜백 메소드에서 클라이언트 측으로 메시지를 보내는 방법

var express = require('express'), 
app = express(); 

app.use(express.static(__dirname + '/')); 

var io = require('socket.io').listen(app.listen(1337)); 

io.sockets.on('connection', function(socket) { 
    socket.on('mesg_to_server', function(data) { 

     // This is for testing whether we're receiving msgs on client side 
     io.sockets.emit("mesg_to_client",{ mesg: data["mesg"], mesg1: data["mesg1"] }); 

     var Rackspace = require('./ex_rackspace'); 
     var rackspace = new Rackspace(); 
     rackspace.create(data.mesg); 
    }); 
}); 

ex_rackspace.js :

var pkgcloud = require('pkgcloud'), 
    _ = require('./node_modules/pkgcloud/node_modules/underscore'); 

    var client = pkgcloud.providers.rackspace.compute.createClient({ 
       username: 'xxxx', 
       apiKey: 'xxxxx', 
       region: 'HKG' 
       }); 

    // This function will handle our server creation, 
    // as well as waiting for the server to come online after we've 
    // created it. 
    function handleServerResponse(err, server) { 
    if (err) { 
     console.dir(err); 
     return; 
    } 

    console.log('SERVER CREATED: ' + server.name + ', waiting for active status'); 

    // Wait for status: ACTIVE on our server, and then callback 
    server.setWait({ status: server.STATUS.running }, 5000, function (err) { 
     if (err) { 
     console.dir(err); 
     return; 
     } 

     console.log('SERVER INFO'); 
     console.log(server.name); 
     console.log(server.status); 
     console.log(server.id); 

     console.log('Make sure you DELETE server: ' + server.id + 
    ' in order to not accrue billing charges'); 
    }); 
    } 

    var Rackspace = function() { 

    }; 

    Rackspace.prototype.test = function (text) { 
    console.log("provider: Rackspace: " + text); 
    }  

    // first we're going to get our flavors 
    Rackspace.prototype.create = function (server) { 
    client.getFlavors(function (err, flavors) { 
    if (err) { 
     console.dir(err); 
     return; 
    } 

    // then get our base images 
    client.getImages(function (err, images) { 
     if (err) { 
     console.dir(err); 
     return; 
     } 

     var flavor = _.findWhere(flavors, { name: '1 GB Performance' }); 

     var image = _.findWhere(images, { name: 'CentOS 5 (PV)' }); 

     // Create our first server 
     client.createServer({ 
      name: server, 
      image: image, 
      flavor: flavor 
     }, handleServerResponse); 
    }); 
    }); 
    } 

    module.exports = Rackspace; 

page.html (클라이언트 측) : 당신은 추가해야

<!DOCTYPE html> 
<html> 
    <head> 
    <script src="/socket.io/socket.io.js"></script> 
    <script type="text/javascript"> 
     // our socket.io code goes here 
     var socketio = io.connect("127.0.0.1:1337"); 

     socketio.on("mesg_to_client", function(data) { 
      document.getElementById("chatlog").innerHTML = ("<hr/>" + 
      data.mesg + ' ' + data.mesg1 + document.getElementById("chatlog").innerHTML); 
     }); 

     socketio.on("test_output", function(data) { 
      console.log(data.mesg); 
     }); 

     function sendMessage() { 
      var msg = document.getElementById("mesg_input").value; 
      socketio.emit("mesg_to_server", { mesg : msg, mesg1 : "here"}); 
     } 

    </script> 
</head> 
<body> 
    <input type="text" id="mesg_input"/> 
    <button onclick="sendMessage()">Create</button> 
    <div id="chatlog"></div> 
</body> 
</html> 

답변

1

여기

코드입니다 create 함수의 콜백

당신이
rackspace.create(data.mesg, function (err, message){ 
    //your code with your socket emit here 
}); 
+0

당신의 노력을 높이 평가 만들 호출 할 때
Rackspace.prototype.create = function (server, callback){ //your code - if err send error else send success message callback(err, message) } 

그런 다음 그것을 사용할 수 있습니다. 사실, handleServerResponse에서 서버 생성이 함수 rackspace.create 내에서 시작될 때 호출되는 콜백 함수를 내보내려고합니다. socket.io를 rackspace.create (data.mesg, io)에 매개 변수로 전달하고 exServerPath.js에 전역 변수에 할당하여 handlerServerResponse에 사용할 수있는 방법을 찾았습니다. 이제 handlerServerResponse에서 클라이언트로 정보를 내보낼 수있게되었습니다. 그러나 나는 그렇게하는 것이 더 깔끔한 방법이 아니라고 생각합니다. 그것에 대한 어떤 생각? – devd