如何解决一个ReferenceError在Node js (var未定义)



我是javascript新手,我可能会问一些简单的问题。我正在尝试使用SockJS, nodeJs和nodeJs的ssh2模块开发一个项目。

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

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
stream.write(message);
             ^
ReferenceError: message is not defined
at onShell (C:Documents and Settings...server.js:62:18)
at C:Documents and Settings...node_modulesssh2libChannel.js:277:5
at Parser.<anonymous> (C:Documents and Settings...node_modulesssh2l
ibChannel.js:123:30)
at Parser.EventEmitter.emit (events.js:92:17)
at Parser.parsePacket (C:Documents and Settings...node_modulesssh2l
ibParser.js:594:12)
at Parser.execute (C:Documents and Settings...node_modulesssh2libP
arser.js:238:14)
at Socket.<anonymous> (C:Documents and Settings...node_modulesssh2l
ibConnection.js:488:18)
at Socket.EventEmitter.emit (events.js:95:17)
at Socket.<anonymous> (_stream_readable.js:746:14)
at Socket.EventEmitter.emit (events.js:92:17)

我知道在函数内使用message var可能不会起作用,但我还没能找到解决方案。我可能缺乏一些关于函数的知识。任何帮助都是感激的。谢谢你。

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

您正在尝试访问范围外的message。您可以这样做,将其传递给onShell:

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

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

最新更新