Пустой вывод с шаблоном усов, connect & node.JS


Я только что вошел в этот узел.js business и нравится это до сих пор; однако я столкнулся с проблемой, связанной с connect/mustach.

Вот код для простого одностраничного приложения; на данный момент я действительно просто пытаюсь заставить приложение использовать мои шаблоны усов, чтобы я мог взять его оттуда.

var connect = require("connect"),
    fs = require("fs"),
    mustache = require("mustache");

connect(
  connect.static(__dirname + '/public'),
  connect.bodyParser(),
  function(req, res){
    var data = {
          variable: 'Some text that I'd like to see printed out. Should in the long run come from DB.'
        },
        htmlFile = fs.createReadStream(
          __dirname + "/views/index.html",
         { encoding: "utf8" }
        ),
        template = "",
        html;

    htmlFile.on("data", function(data){
      template += data;
    });
    htmlFile.on("end", function(){
      html = mustache.to_html(template, data);
    })

    res.end(html);
  }
).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

Моя проблема здесь заключается в том, что приведенный выше код генерирует пустую веб-страницу. Если я регистрирую переменную html, то получаю два вывода html с вложенным в нее текстом variable, так что to_html - функция, кажется, делает свою работу. И если я делаю res.end('some string');, строка отображается в браузере так, как она должна.

Шаблон является простым старым .html-файл с тегом <p>{{variable}}</p> в теле.

Любая идея, что случилось?

1 2

1 ответ:

Ваша проблема заключается в том, что вы неправильно используете асинхронный код. К моменту вызова res.end(html) файл еще не считан. Правильное использование:

 htmlFile.on("end", function(){
      html = mustache.to_html(template, data);
      res.end(html);
 })

Также следует позаботиться о синтаксической ошибке: variable: 'Some text that I'd like to see printed out. Should in the long run come from DB.'
(злоупотребление')