Javascript Node.js:侦听器有问题

Javascript Node.js:侦听器有问题,javascript,node.js,listener,Javascript,Node.js,Listener,我正在Node.js中开发我的第一个应用程序,我想我还没有正确理解listener是如何工作的,因为我编写的示例没有显示我认为它将要显示的内容 我想使用一个模块(msfnode),它是一个metasploit RPC客户端,因此它通过WebSocket进行连接 我创建了一个类,构造函数有以下代码: this.clientmsf = new MetasploitClient({ login : options.login || 'myLogin',

我正在Node.js中开发我的第一个应用程序,我想我还没有正确理解listener是如何工作的,因为我编写的示例没有显示我认为它将要显示的内容

我想使用一个模块(msfnode),它是一个metasploit RPC客户端,因此它通过WebSocket进行连接

我创建了一个类,构造函数有以下代码:

this.clientmsf = new MetasploitClient({
            login : options.login || 'myLogin',
            password : options.password || 'myPassword'
        });
        this.clientmsf.on('connected',function(err,token) {
            if (err) throw err; 
        });
所以我想我可以在该类的其他函数中使用对象“clientmsf”,它显示了一个错误:error_消息:“无效的身份验证令牌”。代码如下:

this.clientmsf.exec(['console.create'], function(err,r){
            consoleID = r.id;
            console.log(r);
        });
我想我有这个错误,因为我不知道node.js的所有概念,所以如果有人帮助我,我将非常感激

多谢各位

警察局。这是msfnode库的一个示例:

var metasploitClient = require('metasploitJSClient');
var onConnect = function(err,token) {
    if (err) {
        console.log(err.error_message);
        process.exit(0);
    }
    metasploitVersion();
}
var metasploitVersion = function() {
    // Do not care about token, it will automaticaly
    // be added as the second arguments
    // The first value of the array is the function
    // you want to call. Full list is available
    // in metasploit remote api documentation
    var args = ['core.version'];
    client.exec(args,function(err,r) {
        if (err) return console.log('Error: '+err);
        console.log('-> Version: '+r);
    });
}
var client = new metasploitClient({
    login:'myLogin',
    password:'myPassword',
});
client.on('connected',onConnect);
错误:

{ error: true,
  error_class: 'Msf::RPC::Exception',
  error_string: 'Msf::RPC::Exception',
  error_backtrace: 
   [ 'lib/msf/core/rpc/v10/service.rb:148:in `process\'',
     'lib/msf/core/rpc/v10/service.rb:90:in `on_request_uri\'',
     'lib/msf/core/rpc/v10/service.rb:72:in `block in start\'',
     'lib/rex/proto/http/handler/proc.rb:38:in `call\'',
     'lib/rex/proto/http/handler/proc.rb:38:in `on_request\'',
     'lib/rex/proto/http/server.rb:363:in `dispatch_request\'',
     'lib/rex/proto/http/server.rb:297:in `on_client_data\'',
     'lib/rex/proto/http/server.rb:157:in `block in start\'',
     'lib/rex/io/stream_server.rb:48:in `call\'',
     'lib/rex/io/stream_server.rb:48:in `on_client_data\'',
     'lib/rex/io/stream_server.rb:192:in `block in monitor_clients\'',
     'lib/rex/io/stream_server.rb:190:in `each\'',
     'lib/rex/io/stream_server.rb:190:in `monitor_clients\'',
     'lib/rex/io/stream_server.rb:73:in `block in start\'',
     'lib/rex/thread_factory.rb:22:in `call\'',
     'lib/rex/thread_factory.rb:22:in `block in spawn\'',
     'lib/msf/core/thread_manager.rb:100:in `call\'',
     'lib/msf/core/thread_manager.rb:100:in `block in spawn\'' ],
  error_message: 'Invalid Authentication Token',
  error_code: 401 }
编辑2:

这是我检查过的代码:

clientmsf.on('connected',function(err,token) {
    if (err) throw err; 
    var consoleID;
    console.log('token:' + token);
    // should have connected by now
    clientmsf.exec(['console.list'], function(err,r){
        consoleID = r;
        console.log(r);
    });
    console.log (consoleID);
});
这就是它所显示的:

token:[object Object]
undefined
{ consoles: [ { id: '0', prompt: 'msf > ', busy: false } ] }

请注意,在示例代码中,它们是如何仅在连接并获取令牌之后才执行工作的(metasploitVersion)

var onConnect = function(err,token) {
    if (err) {
        console.log(err.error_message);
        process.exit(0);
    }
    // in the connect callback here - you have a token
    // only then call to do the work
    metasploitVersion();
}
尝试将“this.clientmsf.exec”代码移动到connect回调函数中。如果它在回调之外,它将在连接完成之前执行

我还建议您注销回调中的令牌,以确保连接正确

我的建议是:

var clientmsf = new MetasploitClient({
    login : options.login || 'myLogin',
    password : options.password || 'myPassword'
});

clientmsf.on('connected',function(err,token) {
    if (err) throw err; 

    console.log('token:' + token);
    // should have connected by now
    clientmsf.exec(['console.create'], function(err,r, token){
        consoleID = r.id;
        console.log(r);
    });
});

这是您收到的全部错误消息吗?因为节点通常会给出发生错误的行号?你真的在机器上启动了msfrpcd吗?没有,错误来自Metasploit API。我认为问题可能是“竞争条件”,因为“exec”是在连接之前执行的,而对象还不知道令牌。我将添加完整的错误。谢谢Vasil的关注。是的,我这么做了,但我有一个问题,如果我想执行“exec”不止一次,我该怎么做?感谢您bryanmac。错误:TypeError:无法在null处调用undefined的方法“exec”。(/home/dani/proyectos_eclipse/tfg pentesting/lib/msfManager.js:71:25)在msapi.onAuthLogin的EventEmitter.emit(events.js:98:17)上(/home/dani/proyectos_eclipse/tfg pentesting/node_modules/msfnode/metasploitJSClient.js:65:14)在IncomingMessage上)。(/home/dani/proyectos_eclipse/tfg pentesting/node_modules/msfnode/metasploitJSClient.js:41:24)在IncomingMessage.EventEmitter.emit(events.js:117:20)在_stream_readable.js:920:16在进程中。_tickCallback(node.js:415:13)确定-您将进入下一期。在JS中,“this”就是它所在的函数。因此,您需要将clientmsf声明为变量更新的代码段。(记得我看不到你的行号)你好,布莱恩麦克,我编辑了第一篇文章。如您所见,consoleID未定义。请检查错误并记录它。if(err)console.log(err.message)