代码之家  ›  专栏  ›  技术社区  ›  Jeflopo

如何从模块中传递此变量以使用它?

  •  1
  • Jeflopo  · 技术社区  · 6 年前

    page 变量作为模块方法的参数,使用 mymodule.foo(page)

    目标是能够使用木偶对象,如 页码

    E:\scripts\node\myproject\mymodule.js:3
        await page.evaluateOnNewDocument(() => {
              ^^^^
    
    SyntaxError: Unexpected identifier
        at createScript (vm.js:80:10)
        at Object.runInThisContext (vm.js:139:10)
        at Module._compile (module.js:607:28)
        at Object.Module._extensions..js (module.js:654:10)
        at Module.load (module.js:556:32)
        at tryModuleLoad (module.js:499:12)
        at Function.Module._load (module.js:491:3)
        at Module.require (module.js:587:17)
        at require (internal/module.js:11:18)
        at Object.<anonymous> (E:\scripts\node\myproject\app.js:3:18)
    PS E:\scripts\node\myproject>
    

    这是文件 app.js :

    // app.js
    const puppeteer = require('puppeteer');
    
    const mymodule = require('./mymodule');
    
    (async () => {
      const browser = await puppeteer.launch({
        headless: false,
      });
      const page = await browser.newPage();
    
      await mymodule.foo(page);
    
      await browser.close();
    })();
    

    mymodule.js :

    更新: 我已更新此文件以添加 async foo 功能。但是如果我想用 await page.goto('http://www.google.com'); 与等待我得到同样的错误。所以我尝试添加另一个异步 page.evaluateOnNewDocument(async () 然后它运行,打开浏览器,但它不会导航到页面,也不会等待。

    // mymodule.js
    module.exports = {
      foo: async function (page) {
        await page.evaluateOnNewDocument(async () => {
          await page.goto('http://www.google.com');
          await page.waitFor(10000);  // That's Evil, I know
        });
      }
    };
    

    这是实际代码(由@¨) 我正在使用,这不会抛出错误,但还不起作用。

    module.exports = {
      foo: function (page) {
        return page.evaluateOnNewDocument(async () => {
          await page.goto('http://www.google.com');
          await page.waitFor(10000);  // That's Evil, I know
        });
      }
    };
    

    page.goto(<url>) 内部 的功能 mymodule

    2 回复  |  直到 6 年前
        1
  •  2
  •   Md. Abu Taher    6 年前

    让我们面对现实,下面的函数将在 浏览器上下文

    page.evaluateOnNewDocument
    

    错误不在于模块本身,而在于您如何使用它。 page 对象在浏览器上下文中不可用。所以说这不是解决办法。

    如果你想使用页面。在另一个模块中,你可以安全地这样做,

    // mymodule.js
    module.exports = {
      foo: async function (page) {
          await page.goto('http://www.google.com');
          await page.waitFor(10000);
      }
    };
    

        2
  •  1
  •   hong4rc 6ark    6 年前

    你需要标记你的功能是 async 使用 await 试试这个:

    // mymodule.js
    module.exports = {
      foo: async function (page) {
        await page.evaluateOnNewDocument(async () => {
          await page.goto('http://www.google.com');
          await page.waitFor(10000);
        });
      }
    };
    

    这段代码将修复代码的语法,但它的逻辑是错误的。

    • 你不需要 在里面 module.exports.foo mymodule.js
    • 异步 没有能力使用它内部的功能。

    您可以尝试:

    // mymodule.js
    module.exports = {
      foo: function (page) {
        return page.evaluateOnNewDocument(async () => {
          await page.goto('http://www.google.com');
          await page.waitFor(10000);
        });
      }
    };