Expressjs +车把格式化日期

时间:2012-10-22 09:23:04

标签: node.js express handlebars.js mustache momentjs

我有这个对象

{ title: 'A TITLE',
  description: 'Lorem Ipsum...',
  _id: 50806930bbf612a858000013,
  __v: 0,
  screenings: 
   [ { venue: 'Venue1', dates: [Object] },
     { venue: 'Venue2', dates: [Object] } ] }

来自我的mongoDB。

dates是一个日期列表(dah!)。

现在我的问题是我希望将它们格式化为momentjs 服务器端

看起来我应该使用小胡子lambdas,但看起来不可能使用我的堆栈( expressjs 合并把手 .. 。)

有人解决了这个问题吗?

这就是我现在正在尝试的事情

Theatre.find({"screenings.dates":{$gte:lastSunday, $lte:nextSunday}}, function(err, entities){
    res.render('index', {
        entities: entities,
        giveitatry: function(a) {
            return moment(a).format("MMM Do YY")
        }
    });
});

在我的模板上我有:

{{#entities}}
<div class="span3">{{#giveitatry}} {{dates.0.}} {{/giveitatry}}</div>
{{/entities}}

这是expressjs conf

的一部分
var moment = require('moment');

var express = require('express')
  , cons = require('consolidate')
  , name = 'mustache';

app.configure(function(){
 app.set('view engine', 'hjs');
 app.engine('.hjs', cons.mustache);
 ...

是的,扩展仍然是hjs'因为我开始使用hogan但是我无法用hogan这样做,所以我开始整合+胡子。

我正在使用节点v0.8.8和expressjs 3.0.0rc4

1 个答案:

答案 0 :(得分:1)

如果使用mustache.js lambdas,则需要返回一个函数。此函数的参数是text,其中包含模板内容的文本表示,以及可以显式调用以呈现模板的render

我到目前为止找到的最佳解决方案是首先使用默认渲染器,然后将生成的日期字符串传递回新Date对象的构造函数,然后将其传递给moment功能。最后,您只需使用desirated格式返回日期。

完整代码:

giveitatry: function() {
    return function(text, render) {
        var date = moment(new Date(render(text)));
        return date.format("MMMM Do YY");
    }
}

同样适用于日期列表:

{{#entities}}
  {{#dates}}
    <div class="span3">{{#giveitatry}}{{.}}{{/giveitatry}}</div>
  {{/dates}}
{{/entities}}

在这个问题上,你并不孤单。在mustache.js的问题跟踪器中正在引入帮助器/过滤器,以便为此问题提供更清晰的解决方案(请参阅[1][2])。