使用 node.js 应用程序和 express,如何在没有它的情况下立即将函数传递给 ejs 页面 运行

With a node.js app and express, how can I pass a function to an ejs page without it running immediately

我正在 node.js 中使用 mongoose 和 express 编写应用程序。我想将使用 puppeteer 打开浏览器 window 的异步函数传递给 ejs 页面,并通过单击按钮传递 运行 该函数。此时打开ejs页面,函数运行立即打开,浏览器window打开。我希望函数在按下按钮之前不会 运行。

我的代码如下所示:

browserModule.js

const puppeteer = require('puppeteer');

export.modules = async function startBrowser {
  let browser;
  try {
    console.log("Opening the browser......");
    browser = await puppeteer.launch({
        headless: false,
        args: [
          "--disable-setuid-sandbox",
        ],
        'ignoreHTTPSErrors': true
    });

  } catch (err) {
    console.log("Could not create a browser instance => : ", err);
  }
}

pageController.js

const browserModule = require('../browserModule');
module.exports.renderNewForm = async (req, res) => {
  res.render('/new', browserModule.startBrowser);
}

new.ejs

  <button class="btn btn-info" onclick=openBrowser>Open Book Site</button>
<!-- NOTE: This code does nothing, the openBrowser function runs immediately 
and the new browser window is opened. Clicking on the button has no effect. -->

我看过一些类似的问题,建议将功能代码放在 ejs 文件的脚本中(我想避免),或者创建一个事件处理程序(我不知道如何应用它我的代码的想法)。

谢谢

您可以通过引用函数而不是调用它来实现类似的目的。

改变 const openBrowser = browserModule.startBrowser(); const openBrowser = browserModule.startBrowser;

我错误地尝试在订购应用程序中使用网络浏览器应用程序,方法是从订购应用程序的视图调用网络浏览器应用程序中的函数。 Marc 说这是不可能的是正确的。

我有两个选择:将 2 个应用程序分开并创建一个网络浏览器 api 我可以与订购应用程序一起使用,或者将网络浏览器应用程序完全集成到订购应用程序中。

我选择了后者,并且使用 MVC 模式,为浏览器创建了单独的模型和路由文件,与订购应用程序的模型和路由文件并存。