2016-11-02 2 views
0

Node.jsを使用して1つのHTMLファイルを提供し、同じポートの呼び出しに応答したいと考えました。 HTMLページを提供するときには、コマンドをローカルで実行してコマンドの出力を表示したいと思っています。私は出力を得ることができません。それは間違いを続けます。私は何か根本的なものが欠けていると確信していますが、何が分からないのでしょうここでは、コードスニペットは、次のとおりです。Node.jsはHTMLを提供し、コマンドラインとコールバック関数を実行します

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) 

ありがとう:

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); 
}); 

ここで私が得たエラーです!

+0

エラーは何ですか? – adeneo

+0

@adeneo申し訳ありませんが、私はそれを含めるべきでした。私はエラーメッセージで私の質問を編集しました。 – PLui

答えて

2

あなたが最後の書き込みを行う前に、exec()が非同期であるとしてあなたは、end()を呼んでいます。

はここ

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); 
}); 
+0

それだけです!さて、複数のコマンドを実行したいのですが?これはどうやって変わるでしょうか? – PLui

+0

次に、もう一方を入れたり、約束を使ったりします – adeneo

+0

もう一方を入れ子にして、どちらも更新しません。おそらく、ページが読み込まれたときにコールバックがまだ発生していないためですか? – PLui

0

エラー出力では、助けが簡単になります。しかし、これは、serve-static + expressライブラリで高速に実装することができます。ここで

は、サンプル働いている:WebContentフォルダー内

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); 
}); 

をあなたのindex.htmlファイルを置く

+0

提案していただきありがとうございます。エラー出力を追加しました。あなたのサンプルでは、​​シェルコマンドの実行を含めることができ、出力をキャプチャして出力をWebContentと一緒に表示できますか? – PLui

関連する問題