新手求助 Nodejs 想执行linux命令并拿到结果,这样写哪里不对?

发布于 1周前 作者 wuwangju 来自 nodejs/Nestjs

新手求助 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.");

解释

  1. 使用util模块:将sys替换为util,因为sys已被弃用。
  2. 初始化mondata:创建一个空字符串mondata来存储子进程的输出数据。
  3. 追加数据:在stdout事件的回调函数中,将接收到的数据追加到mondata中。
  4. 等待子进程结束:使用mon.on('close')监听子进程结束事件,在子进程结束后再发送响应,以确保可以获取到完整的输出数据。

通过这种方式,您可以确保在响应客户端之前已经完整地收集了子进程的输出。


已经解决了。。把response写到stdout.on的回调里即可。。还是对异步不理解啊。。

在你的代码中,有几个问题需要解决:

  1. sys模块已经被弃用,可以使用console.log()代替。
  2. 你需要确保mondata在数据完全接收后才被写入响应。
  3. 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响应。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!