Handlebars.compile выдает исключение "Ошибка: Вы должны передать строку или Handlebars AST в Handlebars.compile. Вы прошли <html>...'

посылка

У нас есть рули, запущенные в бэкэнд-приложении nodejs для шаблонирования различных отправляемых сообщений.

Handlebars.compile выдает это исключение (при компиляции шаблонов из партиалов)

Error: You must pass a string or Handlebars AST to Handlebars.compile. You passed <html>
<head>
... extremely long markup
at Object.compile (/Users/guscrawford/rollick-management-console/deployd/node_modules/handlebars/dist/cjs/handlebars/compiler/compiler.js:501:11)
at HandlebarsEnvironment.hb.compile (/Users/guscrawford/rollick-management-console/deployd/node_modules/handlebars/dist/cjs/handlebars.js:39:40)
at Object.invokePartialWrapper [as invokePartial] (/Users/guscrawford/rollick-management-console/deployd/node_modules/handlebars/dist/cjs/handlebars/runtime.js:71:44)
... additional stack trace through to dpd, bluebird etc.

Не может реплицироваться через изоляцию

Продолжайте и попробуйте настроить проект лома:yarn add handlebars handlebars-helper-ternary handlebars-helpers handlebars.numeral

Затем запустите этот скрипт в nodejs:

const   handlebars = require('handlebars'),
        numeralHelper = require('handlebars.numeral'),    
        ternaryHelper = require('handlebars-helper-ternary'),
        helpers = require('handlebars-helpers')({
        handlebars: handlebars
    });
console.log(`Testing...`);
const base = `
<html>
    <body style="font-family:'Segoe UI', Tahoma, Geneva, Verdana,     'sans-serif'; font-size: larger;">
    {{>@partial-block }}
    <td style="text-align: center; padding: 24px;">
    Copyright 2018 My Company, Inc. All rights reserved.

    </body>
</html>

`;
const inner = `
{{#>base}}
    {{subscriber.name}},

    {{member.name}} has received a notifier from {{subscriber.name}}.    

    Click the link below to review!. 
    <a href='{{link}}'>Go!</a>

    Thank you,
    My Company
{{/base}}
`;
numeralHelper.registerHelpers(handlebars);
handlebars.registerHelper('ternary', ternaryHelper);
handlebars.registerHelper("moduloIf", function (index_count, mod, block)     {

    if (index_count > 0 && parseInt(index_count) % (mod) === 0) {
        return block.fn(this);
    } else {
        return block.inverse(this);
    }
});

handlebars.registerHelper("substitute", function(a, options) {
  try {
    function index(obj,i) { return obj ? obj[i] : {} }
    let data = a.split('.').reduce(index, this);
    if (data && typeof data === 'string') return data;
    else return options.fn(this);
  } catch (e) {
    console.log('substitute helper:' + e);
  }
});
handlebars.registerPartial('base',base)
var output = handlebars.compile(inner)({name:'Gus'});
console.log('Output:');
console.log(output)

Дальнейшее рассмотрение

На самом деле у нас есть руль require завернутый в другой модуль с кодом, запущенным для экземпляра handlebars, как показано в примере сценария. Мы экспортируем экземпляр руля.

3 ответа

Решение

Строка была буфером

Несмотря на вход typeof строка шаблона, которую я передавал в виде строки, вывод readFileAsync без прохождения кодирования это необработанный узел Buffer.

Duh

Ошибка очевидна, вы пропускаете что-то, что не является строкой или AST.

Это единственный способ, которым руль генерирует эту ошибку.

if (input == null || (typeof input !== 'string' && input.type !== 'Program')) {
    throw new Exception('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input);
}

Вы, вероятно, передаете object с toString метод, вот почему вы видите:

You passed <html>
<head>
... extremely long markup

const input = {
  toString() {
    return `<html>
    <head>`;
  }
}
console.log('You must pass a string or Handlebars AST to Handlebars.compile. You passed ' + input);

Это решило для меня.

константный шаблон:Handlebars.TemplateDelegate | null = Handlebars.compile(new XMLSerializer().serializeToString(ваш HTML-документ или строка));

console.log(шаблон({ваш_ключ: "ваше_значение"}))

Вероятно, он преобразует тип «документа» в строку XML, представляющую дерево DOM. С Javascript немного сложно иметь дело.

Другие вопросы по тегам