ExpressでReactアプリケーションから渡されたJSファイルを実行することができない。

実現したいこと

コーディングテスト機能を実現するに当たって、Reactアプリケーション側から渡されたJSファイルをExpress側で実行できるようにしたい。

前提

Expressでコーディングテストをする時に渡される複数のファイルの中から(CSV,TEXTなど)、対象のJSファイルの処理を実行し、その実行結果を取得したい。
取得した実行結果は、レスポンスとしてReactに返す予定です

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

提出されたJSファイルにも、きちんとコンテナイメージのOS側から実行権限を与えているのですが、実行結果をconsole.log();で取得できません。

Dockerfile

1FROM alpine:latest 2 3# 必要なパッケージのインストール 4RUN apk update && apk add --no-cache nodejs npm 5 6# Node.jsのインストール 7RUN apk add --no-cache nodejs npm 8 9# Reactの環境構築 10RUN npm install -g express-generator 11 12# アプリケーションのディレクトリを作成 13RUN mkdir /app 14 15# ソースコードをコピー 16COPY . /app 17WORKDIR /app 18 19# 実行権限を付与 20RUN chmod +x /app/ReturnResult/ReturnResult.js 21 22# アプリケーションの依存関係をインストール 23RUN npm install 24 25# ポートの公開 26EXPOSE 3030 27 28# サーバーの起動 29ENTRYPOINT ["npm", "start"] 30

JavaScript

1//ReturnResult.jsの内容です2 3const crypto = require("crypto");4const fs = require('fs');5const path = require('path');6const { execSync, exec } = require('child_process');7 8exports.readingObject = async function(fileAndCode) {9 return new Promise((resolve, reject) => {10 const fileNames = fileAndCode.fileName;11 const contents = fileAndCode.content;12 13 const directoryName = crypto.randomUUID();14 const directory = path.join(__dirname, directoryName);15 16 fs.mkdir(directory, (err) => {17 if (err) {18 console.error(err);19 reject(err);20 return;21 }22 23 for (let i = 0; i < fileNames.length; i++) {24 const filePath = path.join(directory, fileNames[i]);25 fs.writeFileSync(filePath, contents[i]);26 }27 28 executeCode(directory)29 .then(resolve)30 .catch(reject);31 });32 });33};34 35function executeCode(directory) {36 return new Promise((resolve, reject) => {37 fs.readdir(directory, (err, files) => {38 if (err) {39 console.error(err);40 reject(err);41 return;42 }43 44 const jsFile = searchJSfile(files);45 if (!jsFile) {46 console.error('JS file not found');47 reject('JS file not found');48 return;49 }50 51 const jsFilePath = path.join(directory, jsFile);52 53 exec(`chmod +x ${jsFilePath}`, (error, stdout, stderr) => {54 if (error) {55 console.error('Error:', error);56 reject(error);57 return;58 }59 60 try {61 const result = execSync(`node ${jsFilePath}`, { encoding: 'utf-8' });62 console.log(result);63 } catch (error) {64 console.error('Error:', error);65 reject(error);66 }67 });68 });69 });70}71 72function searchJSfile(files) {73 for (let i = 0; i < files.length; i++) {74 if (files[i].match('.js')) {75 return files[i];76 }77 }78}

試したこと

提出されたJavaScriptファイルにOS側から実行権限を付与しました。
その他にも、追加したReturnResult.jsファイルにも、実行権限を付与しました。

コメントを投稿

0 コメント