繁体   English   中英

Node.js server.listen回调吗?

[英]Node.js server.listen callback?

我有一个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+"/"]) }) 

谢谢你们俩

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,因为这是一个异步调用,它将通过回调的第一个参数指示错误。

暂无
暂无

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

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