Node.js
REPL

Node.js内でNode.jsを実行する


はじめに

メッセージアプリ内から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を実行するほどでもないような...