Node.js server.listen回调吗?

May*_*nty 6 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)
    }
}
Run Code Online (Sandbox Code Playgroud)



你们中的一些人要求查看我的代码的全部,所以这里是:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

解决了!

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

})
Run Code Online (Sandbox Code Playgroud)

谢谢你们俩

Pet*_*ons 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+"/"])
}
Run Code Online (Sandbox Code Playgroud)
  • 不知道你正在阅读的文档,但官方的node.js文档server.listen的发言权server.listen(port, [host], [callback])
  • 您不需要try / catch,因为这是一个异步调用,它将通过回调的第一个参数指示错误。