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

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

  1. 服务器端

    路线/指数等我们可以很容易地使用require('moment'); 等等,它工作正常。

  2. 服务器端(EJS视图)

    views / custome.ejs,像<% var m = require('moment'); %> <% var m = require('moment'); %>不起作用

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

我find了另外一种方法,我认为它有一些优点。

  • 不要监视你的代码导出filter。
  • 访问任何方法,而不需要全部导出。
  • 更好的ejs使用(无|pipe道)。

在你的控制器,或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> 

我不是一个Node专家,所以如果有人看到这样做不好,让我知道! 🙂

还有一个select:

通过这种方式,您可以将时间variables设置为本地任何EJS页面中所有脚本可用的本地variables。

在你的“index.js”(或“app.js”)文件中,执行下面的操作:(在使用Express设置你的'app'之后)

 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)这样的variables:

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

也许这稍微更优雅?

我在服务器端使用ejs。 我写了一个从现在返回的ejsfilter函数。

 npm install moment 

./views/page.ejs

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

./routes/page.js

 var ejs = require('ejs') , moment = require('moment'); ejs.filters.fromNow = function(date){ return moment(date).fromNow() } 

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

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

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

在你的路线文件你做

../routes/page.js

 var ejs = require('ejs') , moment = require('moment'); app.locals.fromNow = function(date){ return moment(date).fromNow(); } 

../views/page.ejs

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

只要记得把时间添加到你的package.json文件

 app.locals.moment=require("moment"); 

现在,您可以简单地在EJS文件中使用时刻。

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

 // config, user, moment to the theme layer app.use(function (req, res, next) { // grab reference of render var _render = res.render; // override logic res.render = function (view, options, fn) { // extend config and continue with original render options = options || {}; options.config = config; options.moment = moment; if (req.user && req.user.toJSON) { options.user = req.user.toJSON(); } _render.call(this, view, options, fn); } next(); }); 

如何传递下来require这样的:

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

您可能需要调整以保持path:

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

显然这只适用于Node(后端)。