繁体   English   中英

Node.js:编写一个函数以将 spawn stdout 作为字符串返回

[英]Node.js: Writing a function to return spawn stdout as a string

我试图将此函数的输出作为字符串返回,但它一直以未定义的形式返回。 我哪里错了?

function run(cmd){
    var spawn = require('child_process').spawn;
    var command = spawn(cmd);
    var result = '';
    command.stdout.on('data', function(data) {
            result += data.toString();
    });
    command.on('close', function(code) {
            return result;
    });
}
console.log(run('ls'));

您的函数在command.on语句之后立即返回。 close事件的回调中的return语句无处返回。 return属于事件回调,而不是run()

console.log调用而不是return result

一般来说,您应该编写如下内容:

function run(cmd, callback) {
    var spawn = require('child_process').spawn;
    var command = spawn(cmd);
    var result = '';
    command.stdout.on('data', function(data) {
         result += data.toString();
    });
    command.on('close', function(code) {
        return callback(result);
    });
}

run("ls", function(result) { console.log(result) });
var spawn = require('child_process').spawn,
    command  = spawn('ls', ['/tmp/']);
command.stdout.pipe(process.stdout);

以下链接与您的问题完全相同。

你总是可以将你的函数包装在一个 Promise 中并返回它。 我发现比@fuwaneko 的回调解决方案更有效

function run(cmd) {
    return new Promise((resolve, reject) => {
        var spawn = require('child_process').spawn;
        var command = spawn(cmd)
        var result = ''
        command.stdout.on('data', function(data) {
             result += data.toString()
        })
        command.on('close', function(code) {
            resolve(result)
        })
        command.on('error', function(err) { reject(err) })
    })
}

干净的方式是使用async/await所以试试这样:

const spawn = require('child_process').spawnSync;
 
try {
    const child = spawn(cmd)
    return { stdout: child.stdout.toString(), stderr: child.stderr.toString() }
} catch (error) {
    console.log(error);
    return error
}

打字稿版本:
(遵循常见的当前异步用法)

import { spawn } from 'child_process'

const run = (commandLine: string) => new Promise<string>((resolve, reject) => {
  const [command, ...args] = commandLine.split(/\s+/)
  const child = spawn(command, args)
  const output = [] as string[]
  child.stdout.on('data', chunk => output.push(chunk))
  child.on('close', () => resolve(output.join('').trim()))
  child.on('error', error => reject(error))
})

用法:

const branch = await run('git branch --show-current')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM