我想使用 Node.js 提供一个 HTML 文件并响应同一端口上的调用。当它提供 HTML 页面时,我还希望它在本地运行命令以显示命令的输出。我似乎无法获得输出。它一直出错。我很确定我错过了一些基本的东西,但不确定是什么。这是代码片段:
var os = require("os");
var hostname = os.hostname();
var exec = require('child_process').exec;
var http = require('http'),
fs = require('fs');
fs.readFile('./index.html', function (err, html) {
if (err) {
throw err;
}
http.createServer(function(req, res) {
if(req.url.includes("callback")) {
//do stuff
} else {
res.writeHeader(200, {"Content-Type": "text/html"});
res.write(html);
res.write("<BR><BR>NodeJS Server:"+hostname);
var exec = require('child_process').exec;
var cmd = 'uname -a | awk \'\{print $2\}\'';
exec(cmd, function(error, stdout, stderr) {
res.write("<BR><BR>uname output: "+ stdout);
});
res.end();
}
}).listen(80);
});
这是我得到的错误:
events.js:160
throw er; // Unhandled 'error' event
^
Error: write after end
at ServerResponse.OutgoingMessage.write (_http_outgoing.js:439:15)
at /tmp/web-serve-one-port2.js:111:15
at ChildProcess.exithandler (child_process.js:197:7)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:877:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)
谢谢!
最佳答案
您在执行最后一次写入之前调用 end()
,因为 exec()
是异步的。
这基本上是发生的事情
exec(cmd, function(error, stdout, stderr) {
res.write("<BR><BR>uname output: "+ stdout); // this happens last
});
res.end(); // this happens first
您可以在回复结束后写信。将您的代码更改为:
var os = require("os");
var hostname = os.hostname();
var exec = require('child_process').exec;
var http = require('http'),
fs = require('fs');
fs.readFile('./index.html', function(err, html) {
if (err) {
throw err;
}
http.createServer(function(req, res) {
if (req.url.includes("callback")) {
//do stuff
} else {
var cmd = 'uname -a | awk \'\{print $2\}\'';
exec(cmd, function(error, stdout, stderr) {
res.writeHeader(200, { "Content-Type": "text/html" });
res.write(html);
res.write("<BR><BR>NodeJS Server:" + hostname);
res.write("<BR><BR>uname output: " + stdout);
res.end();
});
}
}).listen(80);
});
关于javascript - Node.js 服务 HTML,执行命令行和回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40381048/