Node.js server.listen回调?

时间:2014-07-08 01:12:22

标签: node.js

我有一个node.js应用程序,我需要在服务器开始监听后运行命令。 server.listen上的文档说:
server.listen(port, [hostname], [backlog], [callback])
但是当我尝试使用此格式时,代码未运行,但没有出现错误消息。 这是我的应用程序的收听部分:

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+"/"])

})

谢谢你们两位

1 个答案:

答案 0 :(得分:5)

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+"/"])
}
  • 不确定您正在阅读哪些文档,但server.listen的官方node.js文档说server.listen(port, [host], [callback])
  • 您不需要try / catch,因为这是一个异步调用,它将通过回调的第一个参数指示错误。