新手求助 Nodejs 想执行linux命令并拿到结果,这样写哪里不对?
新手求助 Nodejs 想执行linux命令并拿到结果,这样写哪里不对?
var http = require(“http”); var sys = require(‘util’);
var spawn = require(‘child_process’).spawn;
function onRequest(request, response) { //这是createServer的回调函数(事件驱动) console.log(“Request received.”);
var mon = spawn("ls", ["-l"]); var mondata; mon.stdout.on('data', function (data) { sys.puts(data); console.log(data) mondata = data }) response.writeHead(200, { "Content-Type" : "text/plain" }); response.write('aaa' + mondata); response.end();
}
http.createServer(onRequest).listen(8888);
console.log(“Server has started.”);
3 回复
您的代码中有一些问题需要修正。主要问题在于如何正确地处理子进程的输出,并确保在响应客户端之前能够获取到完整的输出数据。此外,sys
模块已经被弃用,建议使用console.log
或直接使用util
模块的方法。
下面是修正后的代码示例:
var http = require("http");
var util = require('util'); // 使用正确的模块
var spawn = require('child_process').spawn;
function onRequest(request, response) {
console.log("Request received.");
var mon = spawn("ls", ["-l"]);
var mondata = ""; // 初始化一个空字符串来收集数据
mon.stdout.on('data', function (data) {
console.log(data.toString()); // 打印输出
mondata += data.toString(); // 将数据追加到mondata
});
mon.on('close', function () { // 等待子进程结束
response.writeHead(200, {
"Content-Type": "text/plain"
});
response.write('aaa\n' + mondata); // 在响应中包含数据
response.end();
});
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
解释
- 使用
util
模块:将sys
替换为util
,因为sys
已被弃用。 - 初始化
mondata
:创建一个空字符串mondata
来存储子进程的输出数据。 - 追加数据:在
stdout
事件的回调函数中,将接收到的数据追加到mondata
中。 - 等待子进程结束:使用
mon.on('close')
监听子进程结束事件,在子进程结束后再发送响应,以确保可以获取到完整的输出数据。
通过这种方式,您可以确保在响应客户端之前已经完整地收集了子进程的输出。
已经解决了。。把response写到stdout.on的回调里即可。。还是对异步不理解啊。。
在你的代码中,有几个问题需要解决:
sys
模块已经被弃用,可以使用console.log()
代替。- 你需要确保
mondata
在数据完全接收后才被写入响应。 response.write('aaa' + mondata);
这行代码会立即执行,而此时mondata
可能还没有被赋值。
这里提供一个改进后的示例代码:
var http = require("http");
var spawn = require('child_process').spawn;
function onRequest(request, response) {
console.log("Request received.");
var mon = spawn("ls", ["-l"]);
let responseData = '';
mon.stdout.on('data', function (data) {
responseData += data.toString();
});
mon.on('close', () => {
response.writeHead(200, {"Content-Type": "text/plain"});
response.write(responseData);
response.end();
});
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
这个版本的代码确保了当ls -l
命令完成后,才会将输出结果写入HTTP响应。