当前位置: 首页 > 面试题库 >

如何将“代码”值捕获到变量中?

姬庆
2023-03-14
问题内容

我正在使用以下代码使用nodejs和ssh2模块在Linux机器上重置密码:

// FILE * ./workflow/ssh.js

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

// var opts = require('optimist')
//     .options({
//         user: {
//             demand: true,
//             alias: 'u'
//         },
//     }).boolean('allow_discovery').argv;

// Definition of reset password;

var resetPassword = function(user, host, loginUser, loginPassword){

var command = 'echo -e "linuxpassword\nlinuxpassword" | passwd '+ user;

conn.on('ready', function() {
  console.log('Client :: ready');
  conn.exec(command, function(err, stream) {
    if (err) throw err;
    stream.on('close', function(code, signal) {
      console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
      conn.end();
      return(code);
    }).on('data', function(data) {
      console.log('STDOUT: ' + data);
    }).stderr.on('data', function(data) {
      console.log('STDLOG: ' + data);
    });
  });
}).connect({
  host: host,
  port: 22,
  username: loginUser,
  password: loginPassword
});
};

exports.resetPassword = resetPassword;

我正在从另一个模块(如下所示的test.js)调用resetPassword密码功能。

var ssh = require('./workflow/ssh.js');

result = ssh.resetPassword('test122', '192.168.0.101', 'root' , 'password');
console.log(result)

但是console.log说“未定义”。尝试使用process.nextTick,但没有运气。请帮忙。


问题答案:

欢迎来到node.js中使用异步操作进行开发的世界。最初学习node.js时,这是一个非常常见的错误(也是此处StackOverflow的常见问题)。异步操作将在将来完成一些不确定的时间,与此同时,其余代码将继续运行。实际上,您的resetPassword()函数可能在流完成之前且在resetPassword结果可用之前返回。

因此,您不能直接从resetPassword函数返回结果,因为该函数在结果准备好之前就返回了。相反,您将必须传递回调并在调用回调时获取结果,并且此函数的调用者将必须使用回调而不是直接返回的结果。您可以这样实现:

// FILE * ./workflow/ssh.js

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

// var opts = require('optimist')
//     .options({
//         user: {
//             demand: true,
//             alias: 'u'
//         },
//     }).boolean('allow_discovery').argv;

// Definition of reset password;

var resetPassword = function(user, host, loginUser, loginPassword, callback){

var command = 'echo -e "linuxpassword\nlinuxpassword" | passwd '+ user;

conn.on('ready', function() {
  console.log('Client :: ready');
  conn.exec(command, function(err, stream) {
    if (err) {
        callback(err);
        return;
    }
    stream.on('close', function(code, signal) {
      console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
      conn.end();
      callback(null, code);
    }).on('data', function(data) {
      console.log('STDOUT: ' + data);
    }).stderr.on('data', function(data) {
      console.log('STDLOG: ' + data);
    });
  });
}).connect({
  host: host,
  port: 22,
  username: loginUser,
  password: loginPassword
});
};

exports.resetPassword = resetPassword;

然后,您可以像这样使用它:

var ssh = require('./workflow/ssh.js');

ssh.resetPassword('test122', '192.168.0.101', 'root' , 'password', function(err, code) {
    if (!err) {
        console.log(code);
    }
});

PS从您的原始代码来看,它也并没有真正帮助您从异步回调中抛出。该异常仅发生在任何触发异步回调的node.js基础结构中,而不会返回到原始代码。这就是为什么您的代码也已更改为通过回调传达错误的原因。

根据node.js约定,回调函数至少包含两个参数。第一个参数是一个错误代码,null如果没有错误,则应为错误代码;如果有错误,则为适当的错误代码或错误对象。然后,第二个参数(以及您想要的其他任何参数)传达了一个成功的结果。遵循该约定非常有用,因为它既与node.js在其他地方的处理方式一致,又与某些机械错误处理(例如,将接口修改为使用promises时所做的处理)兼容。



 类似资料:
  • 问题内容: 我正在生成大量的XML,当用户单击表单按钮时,这些XML将作为发布变量传递到API。我还希望能够事先向用户显示XML。 该代码有点像以下结构: 我的XML正在生成一些while循环和其他内容。然后需要在两个位置(预览和表单值)中显示它。 我的问题是。我如何在变量中捕获生成的XML或其他内容,所以我只需要生成一次,然后将其打印出来就可以在预览中生成,然后在表单值中生成? 问题答案:

  • 问题内容: 我想卷曲一个URL并将响应捕获到一个变量中。 当我卷曲命令并回显其输出时,我得到如下正确的响应 我想将相同的响应捕获到变量中,并将该响应用于进一步的操作 以下是我的Jenkinsfile 能否请您告诉我我需要在Jenkinsfile中进行哪些更改 问题答案: 如果要从step 返回输出并将其捕获到变量中,则必须更改: 至: 参考: https : //jenkins.io/doc/pi

  • 问题内容: 如何将值从javascript变量传递到razor变量,asp.net mvc razor视图引擎是否可能? 问题答案: 你不能 原因是他们不在同一时间“生活”。Razor变量是“服务器端变量”,在将页面发送到“客户端”后,它们不再存在。 当服务器收到视图请求时,它仅使用HTML,CSS和Javascript代码创建视图。没有C#代码,所有这些都被“翻译”为客户端语言。 当视图仍在服务

  • 这将base64打印到控制台: 来源:https://stackoverflow.com/A/36281449/1063287 我希望能够将base64赋值给一个变量,所以我尝试了以下操作,基于这个答案: 它目前没有向控制台打印任何内容。 问题: 我正在提交一个表单在谷歌应用程序脚本环境。 我以前已经这样做了,并将一个表单对象(包括一个文件)传递给Google Apps脚本函数。 但是,这种方法的

  • 问题 你用lambda定义了一个匿名函数,并想在定义时捕获到某些变量的值。 解决方案 先看下下面代码的效果: >>> x = 10 >>> a = lambda y: x + y >>> x = 20 >>> b = lambda y: x + y >>> 现在我问你,a(10)和b(10)返回的结果是什么?如果你认为结果是20和30,那么你就错了: >>> a(10) 30 >>> b(10)

  • 问题内容: 我有一个程序,在运行过程中有时需要调用python才能执行某些任务。我需要一个调用python并 捕获pythons stdout 并将其放入某个文件的函数。这是函数的声明 我的问题是捕获 给定命令 (pythonInput)的 所有python输出 。我没有使用python API的经验,我不知道执行此操作的正确方法是什么。我尝试过的第一件事是使用Py_run_SimpleStrin