从节点应用程序与终端交互时出现问题

问题描述 投票:0回答:1

我正在尝试构建一个节点应用程序,它将为我的手机提供远程接口。 这个想法是使用子进程来生成 shell。但我不明白如何提供密码输入并执行多步骤过程,例如重新设置 git repo 的基础。我的应用程序的主要重点是从手机远程管理文件和 git 存储库,但我遇到了 I/O 流问题。 我已附上与 shell 交互的最低限度的代码。

const {spawn} = require('child_process');
    const express = require('express');
    const bodyParser = require('body-parser');
    const {WebSocketServer} = require('ws');
    const app = express();
    const process = require('process');
    const port = 3000;
    const host = '127.0.0.1';

    app.use(bodyParser.json());

    let commandQueue = [];
    let currentChildProcess = null;
    let clients = [];    
    let currentPty = null;

    function startNextProcess() {
        if (commandQueue.length > 0 && !currentChildProcess) {

            const command = commandQueue.shift();
            const baseCommand = "cd '/mnt/c/Users/John/MyDocuments/NodePlayground'";
            const fullCommand = `${baseCommand} && ${command}`;

            currentChildProcess = spawn(fullCommand, {shell: true,stdio:"overlapped"});
        
            let stdoutData = '';
            let stderrData = '';

            currentChildProcess.stdout.on('data', (data) => {
                stdoutData += data.toString();
                clients.forEach((client) => {
                    client.send(stdoutData);
                });
            });

            currentChildProcess.stderr.on('data', (data) => {
                stderrData += data.toString();
                clients.forEach((client) => {
                    client.send(stderrData);
                });
            });
        
            currentChildProcess.on('close', (code) => {
               console.log(`child process exited with code ${code}`);
               console.log(`stdout: ${stdoutData}`);
               console.log(`stderr: ${stderrData}`);
                currentChildProcess = null;
                startNextProcess();
            });
        }
    
}


    const server = app.listen({port:port,host:host}, () => {
    console.log(`Server started at http://localhost:${port}`);
    });
    const wss = new WebSocketServer({server:server,clientTracking: true});

    function messageHandler(message) {
        //console.log(`Received message => ${message}`);
        const json = JSON.parse(message.toString()); 
        const command = json.command;
        if(json.type==='start'){
            commandQueue.push(command);
            startNextProcess();
        }else{
            currentChildProcess.stdin.write(command);
            currentChildProcess.stdin.write('\n');
        }

        this.send('Command received');
    }

    wss.on('connection', (ws) => {
        clients.push(ws);
        ws.on('message', messageHandler);
        ws.send('Hello! Message From Server!!');
    });

node.js shell child-process
1个回答
0
投票

我做了一些与 Vercel 的构建容器交互的东西。可以执行您提到的任务。

它使用 http 和 websockets。

但是,由于http连接是无状态的,所以我必须做管道和做命令分离来执行一系列任务。 如果您使用 websockets,则不需要它。

给你: GitHub

© www.soinside.com 2019 - 2024. All rights reserved.