it-swarm.com.de

versucht, ein Datum auf der Jade-Vorlage zu formatieren

Ich habe eine index.js:

exports.index = function(req, res){
  db.courses.find(function(err, currentCourses) {
    res.render('index', {
      currentCourses: currentCourses
    });
  });
};

Und auf meiner Jade-Vorlage:

tr
    td #{currentCourses[0].start}

Welches Datum ist als "So Sep 29 2013 00:00:00 GMT + 0100 (BST)" formatiert.

Wie kann ich es auf "29 Sep 2013" formatieren?

Bearbeiten (nach Ed Hinchliffes Kommentaren): 

-function prettyDate(dateString){
    -var d = date.getDate(dateString);
    -var monthNames = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];
    -var m = monthNames[date.getMonth()];
    -var y = date.getFullYear();
    -return d+' '+m+' '+y;
-} 
for course in currentCourses
    tr
        td #{prettyDate(course.start)}
17
babbaggeii

Leider nicht besonders einfach. Sie benötigen eine Funktion, um einen String entweder innerhalb Ihrer Vorlage oder außerhalb zu formatieren (und den hübschen String zu übergeben).

So etwas (JADE)

-function prettyDate(dateString){
    //if it's already a date object and not a string you don't need this line:
    -var date = new Date(dateString);
    -var d = date.getDate();
    -var monthNames = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];
    -var m = monthNames[date.getMonth()];
    -var y = date.getFullYear();
    -return d+' '+m+' '+y;
-}


tr
   td #{prettyDate(currentCourses[0].start)}
10
Ed Hinchliffe

Meine Lösung lautet:

Fügen Sie momentjs zu Ihren Gebietsschemas für Expressanwendungen wie folgt hinzu:
app.locals.moment = require('moment');

Dann können Sie moment in beliebigen Jade-Dateien verwenden:
span='(Created at: ' + moment(obj.createTime).format("YYYY/MM/DD") + ')'

Referenz:
Verwenden von Dienstprogrammbibliotheken in serverseitigen Jade-Vorlagen

56
Zhifeng Hu

Die obige Lösung von Zhifeng Hu gab mir die richtige Richtung. Leider hat app.locals.moment bei mir nicht funktioniert.

Sie können die require('moment') aber auch direkt in das Objekt für die Vorlagenattribute übergeben.

var data = {
  title: 'some Nice title',
  updateDate: new Date(),
  ....,
  moment: require( 'moment' )
};

Und dann übergeben Sie das Datenobjekt wie gewohnt an die Template-Funktion.

var template = pug.compile( source );
var html = template( data );

Quelldatei Beispiel:

doctype html
html
  head
    title= title
  body
    div= moment(updateDate).format('YYYY-MM-DD')
3
morecore

Ich gehe gerne ähnlich wie @Zhifeng Hu vor, aber anstatt alles von Einheimischen zu verlangen, brauche ich nur "Requirement", dann kann ich die Dinge in meine Vorlagen ziehen.

app.use((req, res, next) => { res.locals.require = require; next() })

und dann in Jade/Mops

- const moment = require('moment')
div Created at: #{moment(data.createdAt).fromNow()}

Im Grunde das Gleiche, aber ich kann den erforderlichen Code in der Vorlage beibehalten, in der er verwendet wird.

1
McB