简体   繁体   English

Node.js server.listen回调吗?

[英]Node.js server.listen callback?

I have a node.js application and I need to run a command once the server starts listening. 我有一个node.js应用程序,一旦服务器开始侦听,我需要运行一个命令。 The docs on server.listen say: server.listen上的文档说:
server.listen(port, [hostname], [backlog], [callback])
but when I try to use this format, the code is not run, but no error messages are appearing. 但是当我尝试使用这种格式时,代码没有运行,但是没有错误消息出现。 Here is the listening part of my application: 这是我的应用程序的侦听部分:

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)
    }
}



Some of you requested to see the entirety of my code, so here it is: 你们中的一些人要求查看我的代码的全部内容,因此这里是:

 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) } } 

Solved! 解决了!

After combining the answers of both @mscdex and Peter Lyons I have solved the problem. 结合@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+"/"]) }) 

Thank you to both of you 谢谢你们俩

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+"/"])
}
  • Not sure what docs you are reading, but the official node.js docs for server.listen say server.listen(port, [host], [callback]) . 不确定要阅读的文档是什么,但是server.listen的官方node.js文档说server.listen(port, [host], [callback])
  • You don't need try/catch because this is an asynchronous call that will indicate errors via the callback's first argument. 您不需要try / catch,因为这是一个异步调用,它将通过回调的第一个参数指示错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM