Node.js 调用其他语言编译出来的可执行文件是非常常见的场景。
但只要涉及到「实时输出」,一个经典的坑是:缓冲区。
一、swift+node错误示例
swift
swift
import Darwin
print("Hello")
sleep(2)
print("World")
正常输出
Hello
(停 2 秒)
World
打包为可执行文件
shell
swiftc helloworld.swift -o helloworld
node调用
js
import { exec } from 'child_process';
exec('./helloworld', (err, stdout) => {
console.log(stdout);
});
结果,2秒后全部输出,而不是先输出Hello等2秒才到World。
(停 2 秒)
Hello
World
二、修复
swift关闭缓冲
swift
import Darwin
setbuf(stdout, nil) // 关闭缓冲
print("Hello")
sleep(2)
print("World")
node调用
之前的exec适合一次性调用。可以改为spawn更适配流式实时。
js
import { spawn } from 'child_process';
const p = spawn('./helloworld');
p.stdout.on('data', data => {
process.stdout.write(data);
});
另外一种正确写法
js
import { spawn } from 'child_process';
spawn('./helloworld', {
stdio: 'inherit'
});
输出结果,表现正常
Hello
(停 2 秒)
World