在视图中使用 handlebars-express 的帮助程序

use helper of handlebars-express in view

我使用 nodejs 作为后端和 handlebars-express 库

我有 3 个文件,我的 index.js、loginController.js 和 loginTemplate.handlebars

在我的 index.js 中,我声明了这样的把手

const handlebars = require('express-handlebars');
const server = express();

var hbs = handlebars.create({
  helpers: {
    getStringifiedJson: function (value) {
      return JSON.stringify(value);
    },
    ifCond: function (v1, operator, v2, options) {
      switch (operator) {
        case '==':
          return v1 == v2 ? true : false;
        case '===':
          return v1 === v2 ? true : false;
        case '!=':
          return v1 != v2 ? true : false;
        case '!==':
          return v1 !== v2 ? true : false;
        case '<':
          return v1 < v2 ? true : false;
        case '<=':
          return v1 <= v2 ? true : false;
        case '>':
          return v1 > v2 ? true : false;
        case '>=':
          return v1 >= v2 ? true : false;
        case '&&':
          return v1 && v2 ? true : false;
        case '||':
          return v1 || v2 ? true : false;
        default:
          return false;
      }
    },
  },
  layoutsDir: __dirname + '/src/views',
});

server.set('view engine', hbs);

在我的 loginController 中我有这个

const { getTemplate } = require('../services/handlebarsService');

    getTemplate('loginController/loginTemplate', data).then(
      (loginCompiledTemplate) => {
        res.send(loginCompiledTemplate);
      }
    );

我的把手服务:

const handlebars = require('express-handlebars').create();

const getTemplate = async (path, data) => {
  const template = await handlebars
    .getTemplate(`./src/views/${path}.handlebars`)
    .catch((err) => {
      console.log(err);
    });
  return template(data);
};

module.exports = { getTemplate };

但在我看来,当我尝试调用“ifCond”时,它无法识别它,因为它给了我这个错误

{{#if campos }}
{{#each camposManuales}}
{{#ifCond this.field_type == 1 }}
  a
{{/ifCond}}
{{/each}}
{{/if}}

错误:

UnhandledPromiseRejectionWarning: Error: Parse error on line 14:
           .field_type == 1 }}

我该如何解决这个问题?怎么了?非常感谢你!! ^^

您不需要使用 handlebarsService,因为您可以使用 res.render 功能,如下所示。 render 函数内部的作用与您在 handlebarsService.

中所做的基本相同
const handlebars = require('express-handlebars');
const server = express();

var hbs = handlebars.create({
    helpers: {
        toJson: ...,
        ifCond: ...
    }
});


app.engine('handlebars', hbs.engine);
app.set('view engine', 'handlebars');
app.set('views', './views');

app.get('/', (req, res) => {
    // there must be a home.html file in ./views folder
    res.render('home' /*, { some: 'data' }*/);
});

app.listen(3000);

注: create 函数创建了一个新的 handlebars 实例,因此为了让您的代码正常工作,您必须将相同的选项(助手等)传递给两个实例。