【问题标题】:How can I execute command line arguments in a node.js script如何在 node.js 脚本中执行命令行参数
【发布时间】:2020-09-15 22:31:01
【问题描述】:

我对编程很陌生,我正在努力努力——也许这个问题真的不值得问,但我没有取得任何进展,因为……太久了。

我正在尝试在 node.js 脚本中对连接到本地网络的所有设备进行发现搜索。

我发现这个 npm 模块应该可以完成这项工作:https://www.npmjs.com/package/local-devices/v/3.0.0

所以我只是尝试复制粘贴他们给出的示例,以在我的网络中搜索所有设备:

const find = require('local-devices');

// Find all local network devices.
find().then(devices => {
  devices /*
  [
    { name: '?', ip: '192.168.0.10', mac: '...' },
    { name: '...', ip: '192.168.0.17', mac: '...' },
    { name: '...', ip: '192.168.0.21', mac: '...' },
    { name: '...', ip: '192.168.0.22', mac: '...' }
  ]
  */
})

但如果我现在运行脚本,什么都不会发生。

到目前为止我已经尝试过: 1.我尝试将输出保存在一个常量中,并尝试在控制台上输出它

const found = find().then(devices => {
    devices 
    /*[
      { name: '?', ip: '192.168.0.10', mac: '...' },
      { name: '...', ip: '192.168.0.17', mac: '...' },
      { name: '...', ip: '192.168.0.21', mac: '...' },
      { name: '...', ip: '192.168.0.22', mac: '...' }
    ]
    return devices
  })
  console.log(found);

那么控制台输出是Promise { <pending> }。我还没想好怎么处理这个。

  1. 有这个命令行参数arp -a,如果在命令行中执行,会在终端中列出网络中所有设备的所有IP地址。所以它基本上完全符合我的要求,但我需要在下面的代码中使用该输出(我需要从这个列表中找到一个智能插头的特定 IP 地址,但这是另一回事)。

如何获取此命令行参数,并在我的 javascript 代码/我的 node.js 脚本中执行它,并将输出保存在变量/const 中?

最好的问候, 迈克尔

【问题讨论】:

    标签: javascript node.js search command-line discovery


    【解决方案1】:

    当函数返回Promise 时,表示它正在异步运行(网络上有各种关于此的教程)。长话短说,find() 函数将立即返回一个 Promise 对象,然后它会去查找 IP 地址,一旦找到它就会填充 Promise(即fulfill 它)。

    then() 部分是在 Promise 完成后执行的回调。所以你可以做的是:

    const find = require('local-devices');
    
    async function findIP() {
      // Find all local network devices.
      const found = find().then(devices => {
        console.log(devices);
      })
    
      await found;
    }
    
    findIP();
    

    本质上,await 告诉 JS 等到 found Promise 对象完成 - 现在 JS 只是在找到 IP 地址之前退出。

    【讨论】:

    • 感谢您的帮助,但执行此代码时出现语法错误“等待仅在异步函数中有效”。但我已经用其他有效的评论解决了它:)
    • 哦,是的,我应该更清楚 - await 需要包装在异步函数中。我已经更新了上面的代码。
    【解决方案2】:

    当然值得一问! JS 可能是一门令人困惑的语言。

    如果一个函数返回一个 Promise(就像find 所做的那样),那么记录它返回的内容通常不是很有用。 Promise 是在某个时候能够潜在地提供某种有用价值的东西。

    函数的.then 部分是您可以使用promise 包含的值的地方。一旦取回值,Promise 将运行 .then 中包含的函数。所以做类似的事情:

    const find = require('local-devices');
    
    // Find all local network devices.
    find().then(devices => {
      console.log(devices);
    })
    

    意味着当找到设备的函数返回一个值时,它将记录该值。

    【讨论】:

    • 非常感谢,已经解决了,我现在可以将所有 ip 地址保存在设备中。
    【解决方案3】:

    您面临的问题在 JS 世界中非常很常见。我会尽力向你解释。它被称为并发,用非常简单的术语来说,它意味着两个或多个进程(或线程)一起运行,但不是同时运行。一次只执行一个进程。

    更简单:这意味着 then 回调中的代码在 CPU 空闲时被延迟。

    打印found 对象时看到的是Promise { <pending> }。它是一个对象,表示异步操作的最终完成(或失败)及其结果值。它允许您将处理程序/回调与异步操作的最终成功值或失败原因相关联。这让异步方法可以像同步方法一样返回值:异步方法不是立即返回最终值,而是返回一个承诺,以便在未来某个时间点提供该值。

    但我们为什么要关心?你可能会说。嗯,这是因为您可以简单地将find 函数视为“线性”操作。您必须想象您传递了某种回调(通过then),一旦找到所有本地网络设备就会执行该回调。

    所以你可以像这样重写你的代码:

    const find = require('local-devices');
    
    // Find all local network devices.
    find().then(devices => {
      console.log(devices) /*
      [
        { name: '?', ip: '192.168.0.10', mac: '...' },
        { name: '...', ip: '192.168.0.17', mac: '...' },
        { name: '...', ip: '192.168.0.21', mac: '...' },
        { name: '...', ip: '192.168.0.22', mac: '...' }
      ]
      */
    })
    

    但是如果你想避免callback hell

    好吧,JavaScript 提供了 async & await 关键字来帮助您。这只是一种隐藏/处理回调的奇特方式。

    首先,我们需要在async 函数中,这是使用await 的要求。在下面的示例中,我将使用自调用函数使事情变得更好。然后我们可以使用awaitfind 函数中获取结果:

    (async () => {
      const find = require('local-devices');
    
      // Find all local network devices.
      const devices = await find()
    
      console.log(devices)
    })()
    

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2014-06-28
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      相关资源
      最近更新 更多