#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. Теперь это имеет смысл. Спасибо за ваш ответ, я был в замешательстве