2017-06-01 94 views
1

我在我的web項目中使用xterm.js在網頁上有一個終端。每當我刷新我的頁面或重新連接套接字時,由於客戶端的互聯網波動而導致套接字連接中斷。在我的情況下,當前的PWD目錄會丟失,並且屬於用戶主目錄中的指定CWD目錄。所以我必須再次在我工作的地方做CD。xterm.js與同一個PWD重新連接

如何連接並保持在同一個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

回答

0

這可以很容易地通過只是在服務器

更新~/.bashrc在下面把兩個線路解決~/.bashrc文件爲我工作

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

參考Save last working directory on Bash logout