Пустой вывод с шаблоном усов, подключением и node.js

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

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

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> в теле.

Есть идеи, что случилось?


person Erik    schedule 21.04.2012    source источник


Ответы (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.'
(неправильное использование ')

person mihai    schedule 21.04.2012
comment
Ааа, вот оно; и, конечно, теперь, когда вы упомянули об этом, ясно как день, где была ошибка. Спасибо, что указали на это! - person Erik; 21.04.2012