Node.js服务HTML,执行命令行和回调函数
Node.js serving HTML, execute command line and callback function
我想使用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);
});
使用错误输出将更容易提供帮助。但是,它可以通过server -static + express库快速实现。
下面是工作示例:
var serveStatic = require('serve-static');
var express = require('express');
var app = express();
var port = process.env.PORT || 8000;
app.use(serveStatic(__dirname + "/WebContent")).listen(port, function() {
console.log('Server started on port: ' + port);
});
在WebContent文件夹中放置index.html文件
相关文章:
- AngularJS:我可以跳过函数参数回调吗
- 要求未定义JS回调参数
- MeteorJS:在带有回调的vzaar api上正确使用wrapAsync
- 自引用回调
- 测试Angular Service解决错误回调中的promise
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- 如何将一个JavaScript函数回调为多个函数
- JavaScript回调函数
- 用于回调的javascript参数
- 命令行中的Uglify js;不要弄乱变量名
- 将json回调数据转换为日期
- 承诺在非节点式回调上使用Bluebird
- 行上的Primefaces数据表选择javascript回调
- j查询行在回调函数中不起作用
- Chrome 不会在 jQuery 动画的回调中执行所有行
- JavaScript:回调,不会停止执行下面的行
- 任何jQuery“;打字机”;支持换行+回调函数的插件
- 如何使用javascript在Usercontrol中找到ASPxGridView,然后命令它执行回调
- Node.js服务HTML,执行命令行和回调函数
- 如何获得javascript调用源行号在SpiderMonkey JSNative回调