Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use node modules (like MomentJS) in EJS views?

To use MomentJS in views/custom.ejs, what is the correct way (if any)?

  1. Server side

    routes/index etc we can easily use require('moment'); etc and it works fine.

  2. Server Side (EJS views)

    views/custome.ejs, something like <% var m = require('moment'); %> doesn't work

I am using ExpressJS with EJS as the template engine.

like image 438
dmodulus Avatar asked Oct 09 '12 07:10

dmodulus


3 Answers

I found another way of doing this, and I think it has some advantages.

  • Don't polute your code exporting filters.
  • Access any method without the need to export them all.
  • Better ejs usage (no | pipes).

On your controller, or view.js do this:

var moment = require('moment');
exports.index = function(req, res) {
    // send moment to your ejs
    res.render('index', { moment: moment });
}

Now you can use moment inside your ejs:

<html>
    <h1><%= moment().fromNow() %></h1>
</html>

I'm not an Node expert, so if anyone see something bad on doing this, let me know! :)

like image 116
robertomarin Avatar answered Oct 16 '22 04:10

robertomarin


One more option:

This way you are setting the moment variable to a local available to all scripts in any EJS page on your site.

In your "index.js" (or "app.js") file do this: (after you have set up your 'app' with Express)

var moment = require('moment');
var shortDateFormat = "ddd @ h:mmA"; // this is just an example of storing a date format once so you can change it in one place and have it propagate
app.locals.moment = moment; // this makes moment available as a variable in every EJS page
app.locals.shortDateFormat = shortDateFormat;

Then in your EJS file you can refer to moment (and shortDateFormat) as variables like this:

<%= moment(Date()).format(shortDateFormat) %>

Perhaps this is slightly more elegant?

like image 34
Matt Manuel Avatar answered Oct 16 '22 05:10

Matt Manuel


var moment = require('moment');
app.locals.moment = moment;

Use in the view:

<%= moment(myDateValue).fromNow() %>

Now you can simply use moment in your EJS files.

like image 21
Mostafa Darezereshki Avatar answered Oct 16 '22 04:10

Mostafa Darezereshki