1. ホーム
  2. node.js

[解決済み] EJSテンプレート(ExpressJS使用)において、変数の存在を確認する適切な方法は何ですか?

2022-05-14 02:39:03

質問

EJSのgithubページには、簡単な例が1つだけ載っています。 https://github.com/visionmedia/ejs

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

これは、userという変数が存在するかどうかをチェックして、存在したら何かをしているようです。 ウンザリでしょ?

私の疑問は、なぜNodeは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)

サーバー コードにローカル変数 "user" を追加するだけでこのエラーを解消できることは理解していますが、ここでの要点は、毎日の if/else nullcheck 型パターンを使用して、実行時にそのような変数の存在をチェックしたい、ということです。 存在しない変数に対する例外は、私には馬鹿げているように思えます。

どのように解決するのですか?

jsで何かするのと同じ方法です。 typeof foo == 'undefined' とするか、あるいは "locals" がそれらを含むオブジェクトの名前であることから if (locals.foo) . ただの生JSです :p