spawnとともに用いるコールバック(onで登録する関数)の動作を勘違いしておられる気がします。
find関数は何もreturnしてませんので
let data = find()
としてもdataの中身はundefinedにしかなりません。
も少しfindでやっていることを補足すると
(1)子供プロセスでfindコマンドを実行する
(2)子供プロセスが何かをstdoutへ出力した際に呼び出されるコールバック関数を登録
(3)上記を行ったらサブプロセスからの出力や終了は待たずにすぐにreturn
となります。(2)で登録したコールバック関数から何かをreturnしてもそれはfind関数の戻り値とはなりません。
おそらく下記のようなことをしたかったのではないかと想像します。なお、spawnの用い方の変更以外に以下の点を変更しています。
単に動作の確認のしやすさのためですが、
find . -name '*.pde' -exec echo {} \;
と同様のことを-execをnode側で行うような動作にしてみてます。
let name = function (...) {}
ではなく単にfuntion name(...) {}
とした
letにすべきところがないと感じたので全部constにしました。
t.js
js
1const { spawn } = require('child_process')
2
3function find(callback) {
4 const proc = spawn('find', ['.', '-name', '*.pde'])
5 const pid = proc.pid
6 console.log(`find: spawn pid=${pid}`)
7 proc.stdout.on('data', data => {
8 console.log(`data: ${data}`)
9 for (const s of ('' + data).split('\n').filter(s => s != '')) {
10 callback(s)
11 }
12 })
13}
14
15function echo(path) {
16 const proc = spawn('echo', [path])
17 const pid = proc.pid
18 console.log(`echo: spawn pid=${pid}`)
19 proc.stdout.on('data', data => {
20 console.log(`echo: ${data}`)
21 })
22 proc.on('exit', (code, signal) => {
23 console.log(`echo: ${pid} done code=${code}, signal=${signal}`)
24 })
25}
26
27function doProcessPipeline() {
28 find(echo)
29}
30
31doProcessPipeline()
結果例:
bash
1$ ls
2a.pde b.pde c.pde t.js
3$ node t
4find: spawn pid=4751
5data: ./b.pde
6./c.pde
7./a.pde
8
9echo: spawn pid=4752
10echo: spawn pid=4753
11echo: spawn pid=4754
12echo: 4752 done code=0, signal=null
13echo: 4753 done code=0, signal=null
14echo: 4754 done code=0, signal=null
15echo: ./b.pde
16
17echo: ./c.pde
18
19echo: ./a.pde
20
21$