我有一个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+"/"])
})
谢谢你们两位
答案 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])
。