2014-05-24 85 views
0

我創建了一個web服務器,它通過觸發ls -l來顯示目錄和文件列表。由於我是node.js環境的新手,我不知道如何爲異步代碼結束HTTP Body Response。 以下是我的代碼 -如何在node.js中結束HTTP響應正文

var terminal = require('child_process').spawn('bash'); 
var http = require('http'); 
var s = http.createServer(function (req, res) { 

    res.writeHead(200, {'content-type': 'text/plain'}); 
    terminal.stdout.on('data', function (data) { 
     res.write('stdout: ' + data); 
    }); 

    setTimeout(function() { 
     res.write('Sending stdin to terminal'); 
     terminal.stdin.write('ls -l\n'); 
     res.write('Ending terminal session'); 
     terminal.stdin.end(); 
    }, 1000); 

    terminal.on('exit', function (code) { 
     res.write('child process exited with code ' + code + '\n'); 
     res.end("Response Ended"); 
    }); 
}); 
s.listen(8000); 

此代碼適用於服務第一個請求。但在服務第二個請求時出現錯誤:「結束後寫入」。 這是怎麼回事?我該如何糾正這一點?

+1

如果你不想重新發明輪子,你應該看看connect和/或[express](http://expressjs.com/)。順便說一句,你應該格式化你的代碼,以便我們可以閱讀它 – hgoebl

回答

3

你只是在服務器啓動前產生一個進程,所以一旦進程退出,你就不能再寫入它了。試試這個:

var http = require('http'), 
    spawn = require('child_process').spawn; 
var s = http.createServer(function (req, res) { 

    var terminal = spawn('bash'); 

    res.writeHead(200, {'content-type': 'text/plain'}); 
    terminal.stdout.on('data', function (data) { 
     res.write('stdout: ' + data); 
    }); 

    setTimeout(function() { 
     res.write('Sending stdin to terminal'); 
     terminal.stdin.write('ls -l\n'); 
     res.write('Ending terminal session'); 
     terminal.stdin.end(); 
    }, 1000); 

    terminal.on('exit', function (code) { 
     res.write('child process exited with code ' + code + '\n'); 
     res.end("Response Ended"); 
    }); 
}); 
s.listen(8000);