2014-03-26 71 views
0

我想知道是否有可能以阻塞方式運行node-ssh2中提供的方法。強制nodejs + ssh2是一個阻塞呼叫

我正在測試我的代碼與節點誓言。 CONN-test.js的

片段

suite = vows.describe("conn-test"); 
suite.addBatch({ 
    topic: function() { 
     return new Connection("1.2.3.4", "root", "oopsoops"); 
    } 
    "run ls": function (conn) { 
     conn.send("ls"); 
    } 
}); 

conn.js

的片段
var ssh2 = require("ssh2"); 
function Connection(ip, user, pw) { 
    //following attributes will be used on this.send() 
    this.sock = new ssh2(); 
    this.ip = ip; 
    this.user = user; 
    this.pw = pw; 
} 
Connection.prototype.send = function (msg) { 
    var c = this.sock; 
    //Copy the example 1 on https://github.com/mscdex/ssh2 
} 

節點誓言運行我的代碼沒有錯誤。然而,問題是誓言終止比從ssh2回調更快。換句話說,我無法從ssh2得到迴應。

看來,節點異步是可能的解決方案之一。但是,我不知道如何強制事件驅動的調用通過異步的幫助變成了阻塞調用。

任何人都可以幫忙嗎?

--Updated 2014年10月4日

修正了在標題....

回答

0

錯字我以前從未使用過的誓言,而是根據自己的reference documentation,你應該使用this.callback,而不是返回的一個值。你的誓言代碼可能會看起來像這樣:

var ssh2 = require('ssh2'), 
    assert = require('assert'); 
suite = vows.describe('conn-test'); 
suite.addBatch({ 
    topic: function() { 
    var conn = new ssh2.Connection(), 
     self = this; 
    conn.connect({ 
     host: '1.2.3.4', 
     port: 22, 
     username: 'root', 
     password: 'oopsoops' 
    }); 
    conn.on('ready', function() { 
     self.callback(conn); 
    }); 
    }, 
    'run ls': function(conn) { 
    var self = this; 
    conn.exec('ls', function(err, stream) { 
     assert(!err); 
     stream.on('exit', function(code, signal, coredump) { 
     assert(code === 0); 
     assert(!signal); 
     assert(!coredump); 
     self.callback(); 
     }); 
    }); 
    } 
});