gpt4 book ai didi

javascript - Node.js:变量范围在 Electron 和非 Electron 脚本中的行为不同

转载 作者:行者123 更新时间:2023-12-03 12:41:31 25 4
gpt4 key购买 nike

我正在尝试将我的一个 Electron 应用程序的命令行版本制作为 Node.js 脚本。首先,我从我的 Electron 应用程序中复制了代码,但它的行为不一样。例如,我在这里创建了两个模块。调用webscraper.scrape()时在 Electron 应用程序中,代码按预期执行。但是,当我在普通的 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 中的数据库变量仅在您导入它的 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;
...
});
}

关于javascript - Node.js:变量范围在 Electron 和非 Electron 脚本中的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60386905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com