我是javascript的新手,我可能会问一些简单的问题。我正在尝试使用nodeJs的SockJS,nodeJs和ssh2模块开发项目。
我尝试使用SockJS库的客户端代码(websockets)向NodeJS服务器发送消息,然后通过ssh2模块从NodeJs发送到我的覆盆子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
stream.write(message);
^
ReferenceError: message is not defined
at onShell (C:\Documents and Settings\...\server.js:62:18)
at C:\Documents and Settings\...\node_modules\ssh2\lib\Channel.js:277:5
at Parser.<anonymous> (C:\Documents and Settings\...\node_modules\ssh2\l
ib\Channel.js:123:30)
at Parser.EventEmitter.emit (events.js:92:17)
at Parser.parsePacket (C:\Documents and Settings\...\node_modules\ssh2\l
ib\Parser.js:594:12)
at Parser.execute (C:\Documents and Settings\...\node_modules\ssh2\lib\P
arser.js:238:14)
at Socket.<anonymous> (C:\Documents and Settings\...\node_modules\ssh2\l
ib\Connection.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)
我知道在该功能中使用消息 var并不可能起作用,但我还没能找到解决方案。我可能缺乏一些关于功能的知识。任何帮助表示赞赏。谢谢。
答案 0 :(得分:1)
您的消息变量仅存在于conn.on范围内(&#39;数据&#39;,函数。您必须在sockserver.on中声明消息(&#39; connection&#39;,或者上面的范围,使其在两个函数中都可见。
答案 1 :(得分:1)
您正试图访问message
超出范围。您可以执行此操作将其传递给onShell
:
conn.on('data', function(message) {
c.shell(function (err, stream) {
onShell(err, stream, message);
});
});
var onShell = function(err, stream, message) {
// Etc...
函数的参数只能在里面函数中访问。