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