2016-11-02 1 views
0

Node.js를 사용하여 하나의 HTML 파일을 제공하고 동일한 포트에서 호출에 응답하고 싶습니다. HTML 페이지를 제공 할 때 명령을 로컬로 실행하여 명령의 출력을 표시하려고합니다. 출력을 얻을 수없는 것 같습니다. 오류가 계속 발생합니다. 나는 근본적으로 뭔가 빠져 있지만 확실하지는 않다. 여기 코드는 다음과 같습니다Node.js에서 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) 

감사합니다!

+0

그리고 무엇이 오류입니까? – adeneo

+0

@adeneo 죄송합니다. 오류 메시지로 내 질문을 편집했습니다. – PLui

답변

2

을 넣어.

여기

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

는 마지막 쓰기 전에 exec()가 비동기과 같이, end()를 호출하고 당신의 index.html 파일

+0

제안 해 주셔서 감사합니다. 오류 출력을 추가했습니다. 샘플의 경우 셸 명령 실행을 포함하고 출력을 캡쳐하고 출력을 WebContent와 함께 표시 할 수 있습니까? – PLui

관련 문제