【问题标题】:Node.js: Variable scope behaves differently in Electron and non-Electron scriptNode.js:变量范围在电子和非电子脚本中的行为不同
【发布时间】:2020-02-25 11:46:48
【问题描述】:

我正在尝试将我的一个 Electron 应用程序的命令行版本制作为 Node.js 脚本。首先,我从我的 Electron 应用程序中复制了代码,但它的行为并不相同。例如,我在这里创建了两个模块。在 Electron 应用程序中调用 webscraper.scrape() 时,代码按预期执行。但是,当我在普通的 Node.js 脚本中调用该函数时,它会抛出一个"database is not defined error"。使用其他变量进行测试,似乎我在 main.js 中定义的任何变量都无法在我的任何模块中访问,这与我的 Electron 应用程序中的情况相反。

这是预期的行为吗?如何使我的变量可以被我的模块访问?这样做是不是很糟糕,如果是这样,我该如何改进我的 Electron 和 Nods.js 脚本?

// main.js
var database = require('./src/database.js');
var webscraper = require('./src/webscraper.js');

database.init().then(()=> {
    webscraper.scrape();
});
// webscraper.js
exports.scrape = function() {
    // Find where we left off
    database.connection.query('SELECT `last_searched` FROM `post_index` WHERE `id` = 0', function (err, results) {
        if (err) throw err;
        ...
    });
}

【问题讨论】:

  • 在 node.js 中,您在 main.js 中的 database 变量仅在您导入它的 main.js 的模块范围内可用。如果您希望它在 webscraper.js 中可用,那么您也需要将它导入那里。每个模块都必须导入它需要的东西。这允许模块显式命名它们的依赖项,使它们更易于共享或重用,并使它们更易于测试。这种做法鼓励“良好的模块设计”。在您的特定情况下,您可能希望/需要将 database 实例传递给您的 scrape() 函数,以便它可以使用您已经初始化的那个。

标签: javascript node.js electron


【解决方案1】:

在 node.js 中,您在 main.js 中的数据库变量仅在您导入它的 main.js 的模块范围内可用。如果您希望它在 webscraper.js 中可用,那么您也需要将它导入那里或将其作为参数传递。每个模块都必须导入它需要的东西。这允许模块显式命名它们的依赖项,使它们更易于共享或重用,并使它们更易于测试。这种做法鼓励“良好的模块设计”。

在您的特定情况下,您可能希望/需要将 database 实例传递给您的 scrape() 函数,以便它可以使用您已经初始化的那个。

这是解决该问题的一种方法(通过将 database 实例作为参数传递给 scrape() 函数):

// main.js
var database = require('./src/database.js');
var webscraper = require('./src/webscraper.js');

database.init().then(()=> {
    webscraper.scrape(database);
});

// webscraper.js
exports.scrape = function(database) {
    // Find where we left off
    database.connection.query('SELECT `last_searched` FROM `post_index` WHERE `id` = 0', function (err, results) {
        if (err) throw err;
        ...
    });
}

【讨论】:

  • 很高兴知道,但是,我很困惑,因为在我的 Electron 应用程序中(与 Node.js 脚本相反)似乎并非如此。有什么办法可以阻止 Electron 中的这种行为,因为每个变量都可以访问,因此很容易走捷径?
  • @BoneJones - 在构建电子应用程序时,您是否使用了某种捆绑器。我不是电子专家,但它支持常规 node.js 模块,所以如果你正确构建它,你应该能够使用常规 node.js 模块就好了。
  • @BoneJones - 您是否使用 webPack 和您的 Electron 代码将其全部捆绑到一个更大的文件中?
  • 没有。至于在Node.js脚本中传递变量,除了在每个函数调用中传递变量之外,有没有更简洁的方法,例如在需要webscraper时传递数据库变量?
  • @BoneJones - 是的,它可以作为模块初始化的一部分传递并保存,只要该模块仅由另一个模块使用/初始化。
猜你喜欢
  • 2023-03-28
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多