[英]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.