142

EJS githubページには、簡単な例が1つだけあります: https ://github.com/visionmedia/ejs

<% if (user) { %>
    <h2><%= user.name %></h2>
<% } %>

これは、userという名前の変数の存在をチェックしているようで、存在する場合は、いくつかの処理を行います。ええと?

私の質問は、ユーザー変数が存在しない場合、なぜノードがReferenceErrorをスローするのかということです。これにより、上記の例は役に立たなくなります。変数の存在を確認する適切な方法は何ですか?try / catchメカニズムを使用して、そのReferenceErrorを取得する必要がありますか?

ReferenceError: user is not defined
    at IncomingMessage.anonymous (eval at <anonymous> (/usr/local/lib/node/.npm/ejs/0.3.1/package/lib/ejs.js:140:12))
    at IncomingMessage.<anonymous> (/usr/local/lib/node/.npm/ejs/0.3.1/package/lib/ejs.js:142:15)
    at Object.render (/usr/local/lib/node/.npm/ejs/0.3.1/package/lib/ejs.js:177:13)
    at ServerResponse.render (/usr/local/lib/node/.npm/express/1.0.7/package/lib/express/view.js:334:22)
    at Object.<anonymous> (/Users/me/Dropbox/Projects/myproject/server.js:188:9)
    at param (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:146:21)
    at pass (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:162:10)
    at /usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:152:27
    at Object.restrict (/Users/me/Dropbox/Projects/myproject/server.js:94:5)
    at param (/usr/local/lib/node/.npm/connect/0.5.10/package/lib/connect/middleware/router.js:146:21)

サーバーコードに「ユーザー」ローカル変数を追加するだけでこのエラーを解消できることは理解していますが、ここで重要なのは、毎日のif / elseを使用して、実行時にそのような変数の存在を確認したいということです。 nullcheckタイプのパターン。存在しない変数の例外は、私にはばかげているように思えます。

4

16 に答える 16

14

「obj === void 0」をチェックするビューヘルパーを作成できます。これはexpress.js用です。

res.locals.get = function() {
    var args = Array.prototype.slice.call(arguments, 0);
    var path = args[0].split('.');
    var root = this;
    for (var i = 0; i < path.length; i++) {
        if(root[path[i]] === void 0) {
            return args[1]?args[1]:null;
        } else {
            root = root[path[i]];
        }
    };
    return root;
}

次に、次のようなビューで使用します

<%- get('deep.nested.non.existent.value') %>  //returns: null
<%- get('deep.nested.non.existent.value', "default value") %> //returns: default value
于 2014-01-21T14:33:52.453 に答える
12

ユーザーが定義されているかどうかを確認するには、次のようにする必要があります。

<% if (this.user) { %>
   here, user is defined
<% } %>
于 2014-02-19T14:22:48.883 に答える
9

mongoose の populate() と一緒に 2 つのコレクション間の関係を作成するときに、node.js と mongoose/express/ejs を使用して同じ問題に遭遇しました。この場合、admins.user_id は存在していましたが、存在しない users._id に関連していました。
だから、理由を見つけることができませんでした:

if ( typeof users.user_id.name == 'undefined' ) ...

「nullのプロパティ 'name'を読み取れません」で失敗していました次に、次のようなチェックを行う必要があることに気付きました。

if ( typeof users.user_id == 'undefined' ) ...

「名前」の「コンテナ」を確認する必要があったので、うまくいきました!
その後、これは同じように機能しました:

if ( !users.user_id ) ...  

それが役に立てば幸い。

于 2013-10-17T21:50:34.123 に答える
3

これは誰かを助けるかもしれません。

<p><%= locals?.message %></p>

また

<p><%= locals.message || '' %></p>
于 2021-04-08T01:01:15.700 に答える
2

私がしていることは、'data' = '' と呼ぶデフォルト オブジェクトを渡し、それをすべての ejs テンプレートに渡すことです。実際のデータを ejs テンプレートに渡す必要がある場合は、それらを「data」オブジェクトのプロパティとして追加します。

このように、「データ」オブジェクトは常に定義され、「データ」のプロパティが ejs テンプレートに存在するがノードのエクスプレス ルートに存在しない場合でも、未定義のエラー メッセージが表示されることはありません。

于 2016-07-13T13:18:12.660 に答える
2

ステートメントには、if次を使用する必要がありますtypeof

<% if (typeof user == 'object' && user) { %>

<% } %>
于 2016-07-19T08:16:02.867 に答える