Javascript 如何解决节点js中的引用错误(未定义变量)

Javascript 如何解决节点js中的引用错误(未定义变量),javascript,node.js,sockjs,Javascript,Node.js,Sockjs,我对javascript还不熟悉,我可能在问一些简单的问题。我正在尝试使用SockJS、nodeJs和nodeJs的ssh2模块开发一个项目 我正在尝试使用SockJS库的客户端代码(websockets)从Chrome发送消息到NodeJS服务器,然后通过ssh2模块从NodeJS发送到我的raspberry pi。问题如下: var http = require('http'); var sockjs = require('sockjs'); var Connection = require

我对javascript还不熟悉,我可能在问一些简单的问题。我正在尝试使用SockJS、nodeJs和nodeJs的ssh2模块开发一个项目

我正在尝试使用SockJS库的客户端代码(websockets)从Chrome发送消息到NodeJS服务器,然后通过ssh2模块从NodeJS发送到我的raspberry pi。问题如下:

var http = require('http');
var sockjs = require('sockjs');
var Connection = require('ssh2');

var c = new Connection();
var sockserver = sockjs.createServer();


var server = http.createServer();
sockserver.installHandlers(server, {prefix:'/socksvr'});
server.listen(9999, '0.0.0.0');

sockserver.on('connection', function(conn) {

    c.connect({
        // Parameters to connect
    });

    //Here goes some code to check that the connection was successful

    conn.on('data', function(message) { 
    //this is when Node receives data from client socket

        //print somethings
        c.shell(onShell); // This is to send command from node to Raspberry Pi

    });

    //Here goes the problem 

    var onShell = function(err, stream) { 
        if (err != null) {
            console.log('error: ' + err);
        }

        stream.on('data', function(data, extended) {
            if (extended === 'stderr'){
                console.log('STDERR: '+data);
                conn.write(data);
            }else{
                if(data != ''){
                    console.log(':' + data);
                    conn.write(':' + data);
                }
            };        
        });

        stream.write(message);

    }

}); 

\server.js:62
流。写(消息);
^
ReferenceError:未定义消息
在onShell上(C:\Documents and Settings\…\server.js:62:18)
位于C:\Documents and Settings\…\node\u modules\ssh2\lib\Channel.js:277:5
在解析器处。(C:\Documents and Settings\…\node\u模块\ssh2\l
ib\Channel.js:123:30)
位于Parser.EventEmitter.emit(events.js:92:17)
在Parser.parsePacket(C:\Documents and Settings\…\node\u modules\ssh2\l
ib\Parser.js:594:12)
在Parser.execute(C:\Documents and Settings\…\node\u modules\ssh2\lib\P
[参考文献:238:14]
在插座上。(C:\Documents and Settings\…\node\u模块\ssh2\l
ib\Connection.js:488:18)
位于Socket.EventEmitter.emit(events.js:95:17)
在插座上。(_stream_readable.js:746:14)
位于Socket.EventEmitter.emit(events.js:92:17)

我知道在该函数中使用messagevar可能不起作用,但我还没有找到解决方案。我可能缺乏一些关于函数的知识。感谢您的帮助。谢谢。

您的消息变量只存在于conn.on('data',函数的作用域内。您必须在sockserver.on('connection',或上面的作用域中声明消息,才能在两个函数中都可见。

您正试图访问范围外的
消息。
您可以这样做,将其传递到
onShell

conn.on('data', function(message) { 
    c.shell(function (err, stream) {
        onShell(err, stream, message);
    });
});

var onShell = function(err, stream, message) { 
// Etc...

函数的参数只能在函数内部访问。

我尝试了同样的方法,但没有成功。最好的方法是在“sockserver.on(…){”后面声明一个名为var的命令,然后在“coon.on('data',…”内声明与消息相等的命令。谢谢这也是一个非常好的答案+开发的代码,非常感谢。
conn.on('data', function(message) { 
    c.shell(function (err, stream) {
        onShell(err, stream, message);
    });
});

var onShell = function(err, stream, message) { 
// Etc...