質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

解決済

Expressでchild_process出力のハンドリング方法

S.Nakagawa255
S.Nakagawa255

総合スコア20

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

1回答

0評価

0クリップ

106閲覧

投稿2022/05/01 23:15

編集2022/05/02 13:17

前提

ExpressでユーザがWebブラウザ操作をしたらサーバ内プログラム(Windows バッチファイル)の出力結果を画面上に表示するシステムを試作しています。
今回はやり方を学ぶためdirコマンドにしていますが、将来的には独自プログラムで処理を行いその結果をWebブラウザで表示することを想定しています。

child_processモジュールにてサーバ上の実行可能ファイルを呼び出せたのですが出力がコンソールにもWebブラウザ側にも表示されません。

実現したいこと

  1. http://localhost:3000/dir を実行
  2. 画面上にdirコマンドの出力結果が表示される

発生している問題・エラーメッセージ

VSCodeのターミナル上には以下のメッセージしか表示されません。
Web画面

PowerShell

PS C:\dirservice> SET DEBUG=dirservice.* & npm start Id Name PSJobTypeName State HasMoreData Location Command -- ---- ------------- ----- ----------- -------- ------- 1 Job1 BackgroundJob Running True localhost Microsoft.Po… > dirservice@0.0.0 start C:\dirservice > node ./bin/www GET / 304 5280.695 ms - - GET /stylesheets/style.css 304 2.375 ms - - GET /favicon.ico 404 18.653 ms - 1582 GET /dir 200 1.494 ms - 8

Webブラウザ
イメージ説明

該当のソースコード

Expressジェネレータで作成して、dir.bat、dir.jsを足しています。

PowerShell

PS> npm install express-generator -g PS> express --view=pug dirservice PS> cd dirservice PS> npm install PS> SET DEBUG=dirservice:* & npm start

フォルダ構成は以下です。

C:\WORK | .gitignore | \---dirservice | app.js | dir.txt | package-lock.json | package.json | +---bin | dir.bat | www | +---node_modules | +---public | +---images | +---javascripts | \---stylesheets | style.css | +---routes | dir.js | index.js | users.js | \---views error.pug index.pug layout.pug

dir.bat

bat

@echo off dir

dir.js

JavaScript

var express = require('express'); var router = express.Router(); var exec = require('child_process').exec; /* GET home page. */ router.get('/', function(req, res, next) { res.send('GET dir!'); exec('cmd.exe ../bin/dir.bat', function(error, stdout, stderr) { if (error != null) { console.log(error); } console.log('stdout: ${stdout}'); console.log('stderr: ${stderr}'); res.send('stdout: ${stdout}'); res.send('stderr: ${stderr}'); }); }); module.exports = router;

app.js、localhost:3000/dir にアクセスしたときdir.jsへルーティングする設定を追加しています。

JavaScript

var createError = require('http-errors'); var express = require('express'); var path = require('path'); var cookieParser = require('cookie-parser'); var logger = require('morgan'); var indexRouter = require('./routes/index'); var usersRouter = require('./routes/users'); var dirRouter = require('./routes/dir'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug'); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', indexRouter); app.use('/users', usersRouter); app.use('/dir', dirRouter); // catch 404 and forward to error handler app.use(function(req, res, next) { next(createError(404)); }); // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;

以下、Expressジェネレータで作成されたまま使用しています。
bin/www

JavaScript

#!/usr/bin/env node /** * Module dependencies. */ var app = require('../app'); var debug = require('debug')('dirservice:server'); var http = require('http'); /** * Get port from environment and store in Express. */ var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** * Create HTTP server. */ var server = http.createServer(app); /** * Listen on provided port, on all network interfaces. */ server.listen(port); server.on('error', onError); server.on('listening', onListening); /** * Normalize a port into a number, string, or false. */ function normalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { // named pipe return val; } if (port >= 0) { // port number return port; } return false; } /** * Event listener for HTTP server "error" event. */ function onError(error) { if (error.syscall !== 'listen') { throw error; } var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; } } /** * Event listener for HTTP server "listening" event. */ function onListening() { var addr = server.address(); var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; debug('Listening on ' + bind); }

error.pug

pug

extends layout block content h1= message h2= error.status pre #{error.stack}

index.pug

pug

extends layout block content h1= title p Welcome to #{title}

layout.pug

pug

doctype html html head title= title link(rel='stylesheet', href='/stylesheets/style.css') body block content

index.js

JavaScript

var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); module.exports = router;

users.js

JavaScript

var express = require('express'); var router = express.Router(); /* GET users listing. */ router.get('/', function(req, res, next) { res.send('respond with a resource'); }); module.exports = router;

補足情報(FW/ツールのバージョンなど)

PowerShell

PS> node --version v14.18.1

package.json

json

{ "name": "dirservice", "version": "0.0.0", "private": true, "scripts": { "start": "node ./bin/www" }, "dependencies": { "cookie-parser": "~1.4.4", "debug": "~2.6.9", "encoding-japanese": "^2.0.0", "express": "~4.16.1", "http-errors": "~1.6.3", "morgan": "~1.9.1", "pug": "2.0.0-beta11" } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。