Использование помощников из express-handlebars для возврата кода в формате HTML

#node.js #handlebars.js #templating

#node.js #handlebars.js #создание шаблонов

Вопрос:

У server.js меня есть что-то вроде этого:

 var express = require('express');
var path = require('path');
var exphbs = require('express-handlebars');

var app = new express();

var handlebars = require('./helpers.js')(exphbs);

app.set('views', path.join(__dirname, 'views'));

app.engine('.hbs', handlebars.engine);


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

app.set ('port', (process.env.PORT || 5000));

app.get('/', function(req,res){
    res.render('home', {
        title: 'Express App with Handlebars templates',
        content: 'This is some content',
        persons: [
            { 
                name: 'branchito', 
                instrument: 'guitar',
            },
            { 
                name: 'joe', 
                instrument: 'flute',
            },
        ]
    });
});



app.listen(app.get( 'port' ), function(){
    console.log('Server started on port '   app.get('port'));
})
  

А затем в моем helpers.js файле:

 function hbsHelpers(hbs) {
  return hbs.create({
    helpers: { // This was missing
      inc: function(value, options) {
        console.log('reading it');
        return parseInt(value)   1;
      },
      strong: function(text) {
          return '<strong>'   text   '</strong>';
      }

      // More helpers...
    }

  });
}

module.exports = hbsHelpers;
  

Но затем вывод, сгенерированный strong помощником, отображает это как <strong>...</strong> … Как бы мне сделать, чтобы эта строка не была экранирована, я знаю, что есть Handlebars.SafeString() , но не знаю, как использовать ее из этого экземпляра express-handlebars..

Ответ №1:

Для вывода необработанного HTML вместо экранированного HTML используйте три фигурные скобки вместо двух.

Например:

 {{{strong}}}
  

Будет выводить необработанный HTML из помощника:

 strong: function(text) {
  return '<strong>'   text   '</strong>';
}
  

Ответ №2:

Не уверен, правильно ли я это понимаю, и, вероятно, немного слишком поздно, но у меня была такая же (или, по крайней мере, похожая проблема):

Когда я хотел показать свой контент с помощью {{ var }}, а var был, например

 <strong>somevar</strong>
  

У меня была проблема в том, что он отображался как

 amp;<strongamp;>somevaramp;</strongamp;>
  

Мой обходной путь заключался в том, что переменная не отображалась через средство визуализации Handlebars по умолчанию, а создавала функцию, делающую это за вас:

 var hbs = exphbs.create({
    /* ... */
    helpers: {
        raw: function (a) { return a; },
    }
});
  

И в моем файле .handlebars я сделал следующее:

 <p>{{#raw var}}{{/raw}}</p>
  

Итак, это в основном то же самое, что и вы. Я тоже попробовал ваш код, и у меня это сработало. Вероятно, вы не вызываете его прямо в файле handlebars?