web-dev-qa-db-ja.com

EJSビューでノードモジュール(MomentJSなど)を使用する方法は?

Views/custom.ejsでMomentJSを使用する場合、正しい方法(ある場合)は何ですか?

  1. サーバ側

    routes/indexなどrequire('moment');などを簡単に使用でき、正常に機能します。

  2. サーバー側(EJSビュー)

    views/custome.ejs、<% var m = require('moment'); %>のようなものは機能しません

テンプレートエンジンとしてEJSでExpressJSを使用しています。

35
dmodulus

これを行う別の方法を見つけましたが、いくつかの利点があると思います。

  • フィルターをエクスポートするコードを汚染しないでください。
  • それらをすべてエクスポートする必要なく、任意のメソッドにアクセスします。
  • より良い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>

私はNodeの専門家ではありません。だから、これを行うのに何か悪いことがあれば、私に知らせてください!:)

55
robertomarin

もう1つのオプション:

このように、モーメント変数を、サイトのEJSページ内のすべてのスクリプトで使用可能なローカルに設定しています。

「index.js」(または「app.js」)ファイルでこれを行います:(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;

EJSファイルでは、モーメント(およびshortDateFormat)を次のような変数として参照できます。

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

おそらくこれはわずかにエレガントです?

19
Matt Manuel

私はejsでサーバー側で瞬間を使います。 fromNowを返すejsフィルター関数を作成しました。

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()
}
10
chovy
var moment = require('moment');
app.locals.moment = require('moment');

ビューで使用:

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

EJSファイルでモーメントを使用できるようになりました。

次のようにrequireを渡すのはどうですか:

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

パスを維持するために微調整する必要がある場合があります。

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

明らかにこれはNode(バックエンド)のみで機能します。

3
haxpanel

関数を作成し、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ファイルに瞬間を追加することを忘れないでください

1
user2125268

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();
0
phuong nguyen

上記のサーバー側(EJSビュー)は、サーバーではなくブラウザーで実行されています。ブラウザは理解できないため、requireは使用できません。 moment.jsをインポートして使用する必要があります

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

また、ミドルウェアを追加して、user、config、momentなど、必要なものをテーマレイヤーに追加できるようにすることをお勧めします。

// 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();
});
0