1

我在我的 web 项目中使用xterm.js在网页上有一个终端。每次我刷新页面或重新连接套接字时,由于客户端的互联网波动而导致套接字连接中断。当前的 PWD 目录丢失,它落入指定的 CWD 目录,在我的例子中是用户主目录。所以我必须再次在我工作的地方做 cd 。

如何在页面刷新或套接字断开之前连接并保持上次的 PWD?

我尝试的一件事是存储术语对象并在重新连接时通过相同的对象进行连接(如果它已经存在)。在 WebSocket 断开连接时不删除进程和对象。

var http = require('http');
var express = require('express');
var app = express();
var expressWs = require('express-ws')(app);
var pty = require('node-pty');
var cors = require('cors');
app.use(cors());
app.options('*', cors());
var terminals = {}; //global terminals

function getUser(token) {
    return new Promise((resolve, reject) => {
      try {
        return http.get({
            host: '',
            path: '',
            headers: {'token': token}
        }, function(response) {
            // Continuously update stream with data
            var body = '';
            response.on('data', function(d) {
                body += d;
            });
            response.on('end', function() {
                return resolve(JSON.parse(body));
            });
        });
      } catch (err) {
        console.log('Api failed');
        console.log(err);
        reject;
      }
    })
}

app.ws('/terminals/:user_id', function (ws, req) {
  try {
    getUser(req.params.user_id) /* cheking with api if user exist in my database*/
      .then(user_info => {
        if(terminals[parseInt(req.params.user_id)]){
          var term = terminals[parseInt(req.params.user_id)];
        }else {
          var term = pty.spawn(process.platform === 'win32' ? 'cmd.exe' : 'bash', [], {
            name: 'xterm-color',
            cwd: cwd,
            env: process.env
          });
          terminals[parseInt(req.params.user_id)] = term;
        }

        term.on('data', function(data) {
          ws.send(data);
        });

        ws.on('message', function(msg) {
          term.write(msg);
        });

        ws.on('close', function () {
          // process.kill(term.pid);
          // delete terminals[parseInt(req.params.pid)];
          // delete logs[req.params.pid];
        });
      })
      .catch(err => {
      })
  } catch (err) {
      console.log('Terminal webSocket failed');
      console.log(err);
  }
});

app.listen(3000);

这对我不起作用。这让我只第一次连接,但是当我刷新我的页面终端时,它没有与现有的商店对象连接。

此外,如果生成的进程被系统杀死但它仍然保留在 javascript 对象中并且脚本尝试与相同的术语对象重新连接,则会出现问题,它将失败。

如何实现与相同 PWD 重新连接的任何指南。

细节

操作系统版本:Mac OS,xterm.js 版本:2.2.3

4

1 回答 1

2

只需更新~/.bashrc服务器即可轻松解决此问题

~/.bashrc在文件中放入以下两行对我有用

PROMPT_COMMAND+='printf %s "$PWD" > ~/.storepwd'
[ -s ~/.lastdirectory ] && cd `cat ~/.lastdirectory`

Ref在 Bash 注销时保存最后一个工作目录

于 2017-06-05T13:04:42.997 回答