javascript - Node.js 服务 HTML,执行命令行和回调函数

标签 javascript node.js

我想使用 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/

相关文章:

javascript - RxJS:如何导入 Just

javascript - AJAX 响应或 AJAX response.response.Text 的 IF 条件不起作用

node.js - 如何在 node.js 服务器中提供 angular2 应用程序

node.js - 为什么 ctx.state 没有传递给另一个中间件?

javascript - 将属性对象分配给具有相同属性的另一个现有对象

javascript - 单击或鼠标悬停时为图像添加边框

javascript - 根据所选数据更新热图

javascript - JQuery UI slider 错误(TypeError : max. toFixed is not a function)

node.js - 通过 REST 进行 native Kubeless 调用

node.js - sails 外水线如何使用?