从 module2.js 调用 nodejs module1.js 然后解析一些变量

calling nodejs module1.js from module2.js then parse some variables

又是我。 :-D 我的下一个奇怪问题是:

我有 2 个 nodejs 模块:

//module1.js

const prompt = require('prompt');
var Excel = require('exceljs');


var wbCO = new Excel.Workbook();
var iCO = 1;
wbCO.xlsx.readFile('costumers.xlsx').then(function (){
  shCO = wbCO.getWorksheet("Sheet");
  while (iCO <= shCO.rowCount){  
    console.log(shCO.getRow(iCO).getCell(1).value +" - "+ shCO.getRow(iCO).getCell(2).value);
    iCO++;
  }

});

prompt.start();

prompt.get([{name:'costumer', required: true, conform: function (value) {
  return true;
}
}], function (key_err, key_result) {
    if (key_err) { return onErr(key_err); }

    var Ccostumer = shCO.getRow(key_result.costumer).getCell(2).value;
    var user = shCO.getRow(key_result.costumer).getCell(3).value;
    var pass = shCO.getRow(key_result.costumer).getCell(4).value;

    function onErr(key_err) {
      console.log(key_err);
      return 1;
    }  

});

       //module2.js

wb.xlsx.readFile('./'+Ccostumer+'/File.xlsx').then(function(){

sh = wb.getWorksheet("Sheet1");

    start_page(sh);
});

async function start_page(sh){  
  var i = 2;
  var result_id = 1;

    const browser = await puppeteer.launch({headless: true});

    while(i <= sh.rowCount){
    var result_cell = sh.getRow(i).getCell(3).text;
        await open_page(browser, result_cell, result_id);
        i++;
        result_id++;
  }
  browser.close();

}

        async function open_page(browser, result_cell, result_id) {

            const page = await browser.newPage();   
            page.setDefaultNavigationTimeout(100000);       

            await page.goto('https://www.mywebsite.com', {
                waitUntil: 'networkidle2'
            });
                //  authentication
                await page.waitFor('input[name="ctl00$ContentPlaceHolder1$Signin1$txtEmail"]');
                await page.$eval('input[name="ctl00$ContentPlaceHolder1$Signin1$txtEmail"]', elu => elu.value = user);
                await page.waitFor('input[name="ctl00$ContentPlaceHolder1$Signin1$txtPassword"]');
                await page.$eval('input[name="ctl00$ContentPlaceHolder1$Signin1$txtPassword"]', elp => elp.value = pass);
                await page.click('input[type="submit"]');
                await page.waitForNavigation();

                //search
                await page.waitFor('input[name="email"]');
                    await page.type('input[name="email"]', result_cell);
                await page.click('input[type="submit"]');

我正在尝试通过 const md1 = require('./module1.js') 从 module2.js 调用 module1.js; 但我没有得到变量,两者都在同一时间 运行ning。

这就是我的问题:

1 - 如何 运行 module2.js 在 module1.js 做出选择后按 ENTER。

2 - 如何将这些变量从 module1.js 解析为 module2.js(Ccostumer、用户、通行证)。

如果您想要 return 模块中的某些内容,您只需 return 某些内容。如果你 require 另一个 Node JS 脚本,它不会自动 return 任何东西,它主要只是 "runs" 脚本。

使用module.exports

这里是 2 个模块的基本示例,一个被另一个调用,returns 是一个值。在此示例中,module1 正在导出一个函数,然后在 module2 中需要并调用该函数。

// module1.js 
module.exports = () => {

   /* doing stuff here */

   return "someValue";

});
// module2.js

const value = require('./module1')();
console.log(value);

>> "someValue"

您必须对您的逻辑进行一点点重新排序,并可能在函数周围包装一些东西。在模块 1 中做出选择后,您希望模块 2 变为 运行。意思是,你想从 module1 调用 module2。也意味着您需要在 module1 中要求 module2,并且在您做出选择后您 运行 module2 与输出。理论上这看起来像这样:

你的例子

虽然我不相信你的代码示例是完整的,但我会尽力给你一个提示。但我不会为你做这些工作

// module1.js

const prompt = require('prompt');
const Excel  = require('exceljs');
const module2 = require('./module2');

const workbook = new Excel.Workbook();
let counter = 1;

workbook.xlsx.readFile('costumers.xlsx').then( function () {

  // Get Worksheet from Workbook
  const sheet = workbook.getWorksheet("Sheet");

  // Print Values of Worksheet
  while (counter <= sheet.rowCount) {
    const value1 = sheet.getRow(counter).getCell(1).value;
    const value2 = sheet.getRow(counter).getCell(2).value;
    console.log(`${value1} - ${value2}`);
    counter++;
  }

  // Open prompt
  prompt.start();

  // Get result from prompt
  prompt.get([
    {
      name:'costumer',
      required: true
    }
  ], function (key_err, key_result) {

    if (key_err) { return console.log(key_err); }

    const costumer = sheet.getRow(key_result.costumer).getCell(2).value;
    const user = sheet.getRow(key_result.costumer).getCell(3).value;
    const  pass = sheet.getRow(key_result.costumer).getCell(4).value;

    return module2(costumer, user, pass);

  });

});
// module2.js

module.exports = function (costumer, user, pass) {

  // Do something with costumer, user, pass
  // the value you get in return from the prompt in module1.js

}

确保你的 module1.js 和 module2.js 在同一个目录中,否则 require('./module2') 将无法工作

在nodejs中,每个文件都有自己的范围,每个文件中声明的变量和函数都属于它们。

为了能够从另一个 .js 文件访问函数或变量,您需要明确导出它们

file1.js

console.log('loading file 1') // runs when the file is loaded

function fileOneFunc () {
  // next line runs only when the function is called
  console.log('this is the fileOneFunc running')
}

module.exports = fileOneFunc

file2.js

// the following line will have access to the exported function from file1
const f1 = require('./file1')

console.log(typeof f1)

f1()

所以,如果你想从 module1.js 到 运行 的代码仅当你想从 module2.js 中调用时,你必须将代码包装在 module1.js 在一个函数中,然后将其导出,如上所示。

然后在你的 module2.js 中按照你说的去做

const md1 = require('./module1.js')

然后只要您认为合适就调用 md1 函数。