Node.js 为什么每次POST请求都会多次触发shell命令,而不是一次。我正在使用nodejs和简单的ssh节点模块

Node.js 为什么每次POST请求都会多次触发shell命令,而不是一次。我正在使用nodejs和简单的ssh节点模块,node.js,express,ssh,Node.js,Express,Ssh,如何使用简单的ssh节点模块,对来自express服务器的每个POST请求只调用一次shell脚本。 注意:在我的第一次POST请求中,脚本/命令执行一次,但在后续请求中,命令执行多次。这种行为的原因是什么 // Snippet that executed once I sent a POST request router.post('/testScript', function (req, res, next) { res.json({ 'some json': '

如何使用简单的ssh节点模块,对来自express服务器的每个POST请求只调用一次shell脚本。 注意:在我的第一次POST请求中,脚本/命令执行一次,但在后续请求中,命令执行多次。这种行为的原因是什么

// Snippet that executed once I sent a POST request
  router.post('/testScript', function (req, res, next) {
    res.json({
        'some json': 'To be send'
    })
    next()
  }, function (req, res) {
    ssh.exec('echo $PATH', {
        out: function(stdout) {
            console.log(stdout);
        }
    }).start();
  })
我的控制台中的结果是:

POST /unixscripts/testScript 200 69.202 ms - 34
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin
请参见,POST请求触发一次,但脚本执行多次。为什么? 每次发送POST请求时的预期输出:

POST /unixscripts/testScript 200 69.202 ms - 34
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin

simple ssh
模块似乎存在问题,其中在循环中使用回调时会多次触发。这在github问题中得到了承认。此外,该模块目前似乎没有得到积极开发

虽然我不知道为什么会发生这种情况,但在
simple ssh
的情况下,
exec
函数会向堆栈添加一个命令。由于您使用的是公共
ssh
connection对象,因此在下一次调用时,堆栈中仍然存在旧的命令。然后,
start
函数执行整个堆栈

模块内部使用较旧版本的
ssh2
模块。您可以在案例中直接使用此模块

npm安装ssh2

var Client = require('ssh2').Client;

router.post('/script', function (req, res, next) {
    res.json({
        'some json': 'To be send'
    })
    next()
}, function (req, res) {
    var conn = new Client();
    conn.on('ready', function () {
        conn.exec('echo $PATH', function (err, stream) {
            if (err) throw err;
            stream.on('data', function (data) {
                console.log('STDOUT: ' + data);
            }).on('close', function (code, signal) {
                conn.end();
            })
        });
    }).connect({
        host: 'localhost',
        username: 'user',
        password: 'password'
    });
})

感谢Stephen,代码与ssh2模块的预期工作一致。虽然我不知道为什么,因为简单ssh在后端使用ssh2。你能解释一下你的解决方案为什么有效吗?我已经用我对这个问题的看法更新了答案。我没有使用过
simple ssh
模块,因此如果不查看源代码,我无法确定。尽管在我的许多项目中,我使用了
ssh2