I have a node.js application and I need to run a command once the server starts listening. The docs on server.listen
say:
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)
}
}
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) } }
After combining the answers of both @mscdex and Peter Lyons I have solved the problem.
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+"/"])
}
server.listen
say server.listen(port, [host], [callback])
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.