2014-07-08 3 views
1

node.js 응용 프로그램이 있고 서버가 수신을 시작하면 명령을 실행해야합니다. server.listen에있는 문서는 다음과 같이 말합니다.
server.listen(port, [hostname], [backlog], [callback])
하지만이 형식을 사용하려고하면 코드가 실행되지 않지만 오류 메시지가 나타나지 않습니다. 그래서 여기있다, 당신의 일부는 내 코드의 전체를 볼 요청Node.js server.listen 콜백?

var spawn = require('child_process').spawn 
function listen(port) { 
    try { 
     server.listen(port, "localhost",511, function() { 
      spawn("open",["http://localhost:"+port+"/"]) 
     }) 
    } catch (e) { 
     listen(port+1) 
    } 
} 



:

var http = require("http"), 
    path = require("path"), 
    fs = require("fs"), 
    mime = require("mime"), 
    port = 1 
var server = http.createServer(function(req, resp) { 
    if (req.url == "/action" && req.headers["command"]) { 
     resp.writeHead(200, { 
      "Content-Type": "text/plain" 
     }); 
     console.log("Command sent: " + req.headers["command"]) 
     try { 
      var out = eval(req.headers["command"]) 
      if (typeof out == "object") { 
       var cache = []; 
       out = JSON.stringify(out, function(key, value) { 
        if (typeof value === 'object' && value !== null) { 
         if (cache.indexOf(value) !== -1) { 
          return "[Circular]"; 
         } 
         // Store value in our collection 
         cache.push(value); 
        } 
        return value; 
       }); 
      } 
      resp.end(out); 
     } catch (e) { 
      resp.end(e.stack) 
     } 
    } 
    var local = __dirname + "/public" + req.url 
    if (fs.existsSync(local)) { 
     if (fs.lstatSync(local).isDirectory(local)) { 
      if (fs.existsSync(local + "/index.html")) { 
       local += "/index.html" 
       resp.writeHead(200, { 
        "Content-Type": mime.lookup(local) 
       }); 
       fs.readFile(local, function(err, data) { 
        if (err) { 
         resp.writeHead(500, { 
          "Content-Type": "text/plain" 
         }); 
         resp.end("Internal server error"); 
         throw err; 
        } 
        resp.end(data) 
       }); 
      } else { 
       server.status_code = 403 
       resp.writeHead(403, { 
        "Content-Type": "text/plain" 
       }); 
       resp.end("GET 403 " + http.STATUS_CODES[403] + " " + req.url + "\nThat Directory has no Index") 
       console.log("GET 403 " + http.STATUS_CODES[403] + " " + req.url) 
      } 
     } else { 
      resp.writeHead(200, { 
       "Content-Type": mime.lookup(local) 
      }); 
      fs.readFile(local, function(err, data) { 
       if (err) { 
        resp.writeHead(500, { 
         "Content-Type": "text/plain" 
        }); 
        resp.end("Internal server error"); 
        throw err; 
       } 
       resp.end(data) 
      }); 
     } 
    } else { 
     if (req.url != "/action") { 
      server.status_code = 404 
      resp.writeHead(404, { 
       "Content-Type": "text/plain" 
      }); 
      resp.end("GET 404 " + http.STATUS_CODES[404] + " " + req.url + "\nThat File Cannot be found") 
      console.log("GET 404 " + http.STATUS_CODES[404] + " " + req.url) 
     } 
    } 
}); 
var spawn = require('child_process').spawn 
function listen(port) { 
    try { 
     server.listen(port, "localhost") 
    } catch (e) { 
     listen(port+1) 
    } 
} 

를 해결 여기 내 응용 프로그램의 듣기 부분이다 !

@mscdex와 Peter Lyons의 답변을 결합한 후에 문제를 해결했습니다.

var spawn = require('child_process').spawn 
server.listen(0,"localhost", function(err) { 
    if(err) throw err; 
    spawn("open",["http://localhost:"+server.address().port+"/"]) 

}) 

여러분 모두에게 감사

당신이 읽고있는 문서,하지만 server.listen의 공식 Node.js를 워드 프로세서 server.listen(port, [host], [callback])을 말
+0

나머지 코드를 게시 할 수 있습니까? 특히 처음에 '수신 대기'라고 부르는 부분이 있습니까? –

+0

넵 .. 그리고 어디서 어떻게 서버가 정의 되었습니까? – zipzit

+3

특정 포트에서 수신 대기 할 필요가 없으면 대신 '0'을 사용할 수 있습니다. 그런 다음 listen() 콜백 내부에서'server.address(). port'를 통해 지정된 포트를 가져올 수 있습니다. – mscdex

답변

3
var spawn = require('child_process').spawn 

function listen(port) { 
    //Don't need try/catch here as this is an asynchronous call 
    server.listen(port, "localhost", function(error) { 
    if (error) { 
     console.error("Unable to listen on port", port, error); 
     listen(port + 1); 
     return; 
    } 
    spawn("open",["http://localhost:"+port+"/"]) 
} 
  • 확실하지.
  • 콜백의 첫 번째 인수를 통해 오류를 나타내는 비동기 호출이기 때문에 try/catch가 필요하지 않습니다.
+0

http://nodejs.org/api/http.html#http_server_listen_port_hostname_backlog_callback 참조 – MayorMonty

+0

내 노드 버전은'v0.11.14-pre'이고 문서는'v0.10.29'를위한 것입니다. 그래서 나는 그들이 변경을했을지도 모른다고 생각하고 있습니다. to server.listen – MayorMonty

+0

내 노드를'v0.10.29'로 업데이트하고 괄호를 올바르게 수정하도록 코드를 수정하십시오. 난 여전히 EACCES 오류가 발생합니다 – MayorMonty