如何在EJS视图中使用节点模块(如MomentJS)?

时间:2012-10-09 07:24:21

标签: node.js express ejs momentjs

要在views / custom.ejs中使用MomentJS,正确的方法是什么(如果有的话)?

  1. 服务器端

    路由/索引等我们可以轻松使用require('moment');等,并且工作正常。

  2. 服务器端(EJS视图)

    views / custome.ejs,<% var m = require('moment'); %>之类的东西不起作用

  3. 我使用ExpressJS和EJS作为模板引擎。

10 个答案:

答案 0 :(得分:53)

我找到了另一种方法,我认为它有一些优势。

  • 不要将您的代码导出过滤器。
  • 访问任何方法而无需全部导出。
  • 更好的ejs用法(无|管道)。

在您的控制器上,或者view.js执行此操作:

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

现在你可以在你的ejs里面使用片刻:

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

我不是节点专家,所以如果有人看到这样做有什么不好,请告诉我! :)

答案 1 :(得分:18)

还有一个选择:

这样您就可以将moment变量设置为您网站上任何EJS页面中所有脚本可用的本地变量。

在你的&#34; index.js&#34; (或&#34; app.js&#34;)文件执行此操作:(在您使用Express设置&#39;应用程序后)

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;

然后在您的EJS文件中,您可以将moment(和shortDateFormat)称为变量,如下所示:

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

也许这稍微优雅一点?

答案 2 :(得分:10)

我在ejs上使用服务器端的时刻。我写了一个ejs过滤器函数,它将从现在返回。

npm install moment

./视图/ page.ejs

<span class="created_at"><%=: item.created_at | fromNow %></span>

./路由/ page.js

var ejs = require('ejs')
  , moment = require('moment');

ejs.filters.fromNow = function(date){
  return moment(date).fromNow()
}

答案 3 :(得分:8)

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

在视图中使用:

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

现在您可以在EJS文件中使用片刻。

答案 4 :(得分:2)

How about passing down require like this:

res.render('index', { require: require });

You might need to tweak to maintain the path:

res.render('index', { require: module => require(module /* here you may insert path correction */) });

Obviously this works with Node (backend) only.

答案 5 :(得分:1)

上面提到的服务器端(EJS视图)在浏览器上运行,而不是在服务器上运行。您无法使用require,因为浏览器无法理解它。您需要导入moment.js才能使用它

<script src="/js/moment.min.js"></script>

答案 6 :(得分:1)

您可以创建该功能并将其附加到app.locals。并在服务器端的ejs模板中使用它。

在您的路线文件中

../路由/ page.js

var ejs = require('ejs')
  , moment = require('moment');

app.locals.fromNow = function(date){
  return moment(date).fromNow();
}

../视图/ page.ejs

<span class="created_at"><%= fromNow(item.created_at) %></span>

请记住将时刻添加到package.json文件

答案 7 :(得分:0)

我认为如果你想要添加一个中间件,你可以添加任何你想要的主题层,包括用户,配置和时刻,这是个好主意:

r8

答案 8 :(得分:0)

我写了一个助手来回复使用ejs视图和布局的时刻。

./helpers/utils/get-moment.js

const moment = require('moment');

module.exports = {
    friendlyName: 'formatMoney',
    description: 'format money number.',
    inputs: {},
    sync: true,
    exits: {},
    fn: function (inputs, exits) {
        return exits.success(moment);
    }
};

然后使用:

const moment = sails.helpers.utils.getMoment();

答案 9 :(得分:0)

从Node v12.8.3开始,似乎您可以直接将require传递给EJS模板,即可以使用:

const ejs = require('ejs')
let renderedHTML = ejs.render(`<% const moment = require('moment') %>`, { require })