はじめに
メッセージアプリ内からNode.jsを実行できたら面白そうだなと思ったものの、ただ送られてきたソースコードをeval()
するだけだとありきたりなので、REPL(対話的実行環境)をNode.js内から実行しようとしたときにハマったので、そのメモです。
TL;DR
- child_process.spawnを使う
- 引数に
-i
をつける わざわざこんなことする必要ない
Node.jsを実行する
Node.js内から何かを実行するときはchild_process
というAPIを使うのでサンプルを見ながら以下のように書いたが反応してくれません
動かない
const child_process = require('child_process')
const node = child_process.spawn('node')
node.stdout.setEncoding('utf8')
node.stdout.on('data', data => console.log(data))
node.stderr.on('data', data => console.log(data))
node.stdin.write('1 + 1\n')
何故動かないのか調べていると、Stack Overflowで興味深い質問を見つけました
この質問はnodeではなくpythonを対話的モードで実行する方法について聞いていますが、
stdinがターミナルでないと対話的モードで実行されないということなので、
もしかしたらnodeでも同じようなことが起きてるのでドキュメントを見てみたら同じような引数があったので試しに追加してみたら無事に動作しました
ソースコード
完成したソースとログも載せておく
node.js
const child_process = require('child_process')
const node = child_process.spawn('node', ['-i'])
node.stdout.setEncoding('utf8')
node.stdout.on('data', data => console.log(data))
node.stderr.on('data', data => console.log(data))
node.stdin.write('1 + 1\n')
node.stdin.write('.exit\n')
$ node node.js
>
2
>
最後に
よく考えたらわざわざREPLを実行するほどでもないような...