требуется node-pty приводит к ошибке типа: Объект.setPrototypeOf: ожидаемый объект или значение null, не определено

#javascript #node.js #reactjs #xtermjs #node-pty

Вопрос:

TL;DR: Если я попытаюсь сделать var pty = require('node-pty'); результаты, TypeError: Object.setPrototypeOf: expected an object or null, got undefined продолжайте читать для контекста

Привет, я пытаюсь построить доказательство концепции, создав терминал с помощью React. Для этого я использовал xterm-for-react, который заставил его работать нормально, и узел-pty с этой последней библиотекой связан с той, с которой у меня возникли проблемы. Изначально я создал файл, в котором я бы попытался позвонить в него, это выглядит так:

 var os = require('os');
var pty = require('node-pty');

var shell = os.platform() === 'win32' ? 'powershell.exe' : 'bash';

var ptyProcess;

function createNewTerminal(FE){
    ptyProcess = pty.spawn(shell, [], {
        name: 'xterm-color',
        cols: 80,
        rows: 30,
        cwd: process.env.HOME,
        env: process.env
      });
    ptyProcess.onData((data) => FE.write(data));
}

function writeOnTerminal(data){
    ptyProcess.write(data);
}

module.exports = {
    createNewTerminal,
    writeOnTerminal
}
 

Я знаю, что это может быть не самый лучший код, но я делал это просто для того, чтобы попытаться понять, возможно ли это. Мой план состоял в том, чтобы вызывать функции из компонента react следующим образом:

     import {createNewTerminal, writeOnTerminal} from './terminal-backend';
    function BashTerminal() {

    const xtermRef = React.useRef(null)

    React.useEffect(() => {
        // You can call any method in XTerm.js by using 'xterm xtermRef.current.terminal.[What you want to call]
        xtermRef.current.terminal.writeln("Hello, World!")
        createNewTerminal(xtermRef.current.terminal)
    }, [])

    const onData = (data) => {
        writeOnTerminal(data);
    }

    return (
        <XTerm ref={xtermRef} onData={onData}/>
    );
  }
 

Но я был удивлен, что это не сработало, и вернул ошибку в названии. Поэтому, чтобы уменьшить шум, я попытался изменить свои функции на просто журналы консоли и просто придерживаться требований. Мое досье теперь выглядело так:

 var os = require('os');
var pty = require('node-pty');

function createNewTerminal(FE){
    console.log("Creating new console");
}

function writeOnTerminal(data){
    console.log("Writing in terminal");
}

module.exports = {
    createNewTerminal,
    writeOnTerminal
}
 

Все та же ошибка. В настоящее время я не уверен, возможно ли это вообще сделать или почему возникает эта ошибка. Попытка посмотреть что-то в Интернете не дает никаких результатов, или, может быть, это так, и я просто делаю это неправильно. Что ж, спасибо за чтение, я совершенно потерялся, так что, если кто-то что-то знает, даже если это не полный ответ, я буду очень благодарен

Комментарии:

1. node-pty является встроенной привязкой к базовой ОС pty, поэтому должен выполняться в контексте, где разрешен доступ к системе (серверные nodejs или электронное окно с включенными модулями nodejs). Он не будет работать в изолированном контексте обычного окна браузера.

2. Теперь это имеет смысл. Спасибо за ваш ответ, я был в замешательстве