【问题标题】:Is it possible to use EJS without routes with nodeJS / Express是否可以在没有路由的情况下使用带有 nodeJS / Express 的 EJS
【发布时间】:2020-10-17 03:54:49
【问题描述】:

我正在运行一个 NodeJS 脚本,它将生成几个 PDF 报告。

问题是我需要为每个 PDF 生成几个图形,所以在几个问题之后,我决定生成 PNG 格式的图形,然后,使 html 页面包含图像。从 HTML 中,我生成了一个 PDF。

问题是我真的不需要路线,但我需要 EJS,我需要 req / res 来生成我的图表:

app.get("/operations/:operation/meters/:meter/weekly_report", async (req, res) => { // Used to generate PNG from graph
    const meterId = req.params.meter;
    const week = req.query.week;
    // get meters from meter
    const meter = meters.find(it => it.prm === meterId);
    const weeklyData = await generateWeeklyGraphForPRM(meter, week);
    ejs.renderFile(path.join(__dirname, './views/partials/', "weekly_graph.ejs"), {
        days: weeklyData.days,
        conso: weeklyData.consoByHour,
        meterLabel: meter.label,

    }, (err) => {
        if (err) {
            res.send(err);
        } else {

            res.render('partials/weekly_graph.ejs', {
                days: weeklyData.days,
                conso: weeklyData.consoByHour,
                meterLabel: meter.label,
            });
        }
    });

然后:

async function makePngScreenshot(url, meterId, filename) {
    axios.get(url, null); // Make the request to generate html page
    const destination = "public/images/" + operation.data.name + "/" + DATE_INI + "_" + DATE_END + "/" + meterId
    return new Pageres({delay: 2, filename: filename})
        .src(url, ['1300x650'], {crop: true})
        .dest(destination)
        .run()

}
    });

一切正常,但现在,一切都在 index.js 中

我正在尝试将代码分成几个文件。

当我将每个路由提取到 routes.js 中时,我遇到的问题是我无法与所有端点共享任何全局变量。

所以,我在这里找到了 3 个解决方案:

  • 使用函数而不是端点:我不需要端点,但我不知道如何渲染没有路由的 EJS 文件,req / res。
  • 在每个路由中,再次获取每个对象(效率低下)
  • 使用 redis 或任何缓存(好的,但我现在想避免使用任何额外的组件)

最简单的应该是把路由转成函数,但是没有路由怎么生成EJS文件,有可能吗?

【问题讨论】:

  • 对不起,我不太明白你不需要路由是什么意思?您是否要创建一个脚本,将输入数据传递给该脚本,它会执行任务并停止其工作?
  • 是的,完全正确。我不需要 API,因为这是触发的工作

标签: node.js express routes ejs


【解决方案1】:

我希望我能正确理解您的任务。我做了一个程序示例,它开始使用命令行,接收命令行参数meterIdweek,从.ejs 模板生成.html 文件。我还使用了yargs 包来轻松解析命令行参数。

const path = require('path');
const fs = require('fs');
const argv = require('yargs').argv;
const ejs = require('ejs');

const fsp = fs.promises;

// It would be a good idea to store these parameters in an .env file
const INPUT_FILENAME = 'test.ejs';
const OUTPUT_FILENAME = 'result.html';
const TEMPLATE_FILE = path.resolve(__dirname, './templates', INPUT_FILENAME);
const STORAGE_PATH = path.resolve(__dirname, './storage', OUTPUT_FILENAME);

(async function main({ meterId, week }) {
    if (!meterId) {
        return console.warn('Specify the command line parameter "meterId"!');
    }
    
    if (!week) {
        return console.warn('Specify the command line parameter "week"!');
    }

    try {
        const html = await ejs.renderFile(TEMPLATE_FILE, { meterId, week }, { async: true });
        await fsp.writeFile(STORAGE_PATH, html);
        console.log('Done.');
    } catch (error) {
        console.error(error);
        process.exit(1);
    }
})(argv);

还有一个运行脚本的示例命令:

node script.js --meterId=141 --week=44

如果我正确理解了您的任务以及我的示例是否有帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 2020-07-20
    • 2014-05-19
    • 1970-01-01
    • 2014-06-16
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多