Jaki jest właściwy sposób sprawdzenia istnienia zmiennej w szablonie EJS (za pomocą ExpressJS)?

Na stronie EJS github jest tylko jeden prosty przykład: https://github.com/visionmedia/ejs

Przykład

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

To wygląda na sprawdzanie istnienia zmiennej o nazwie user, a jeśli ona istnieje, zrób kilka rzeczy. NO nie?

Moje pytanie brzmi, dlaczego w świecie Node miałby rzucać ReferenceError, jeśli zmienna użytkownika nie istnieje? To czyni powyższy przykład bezużytecznym. Jaki jest odpowiedni sposób sprawdzenia istnienia zmiennej? Czy oczekuje się, że użyję mechanizmu try/catch i złapię ten 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)

Rozumiem, że mogę sprawić, że ten błąd zniknie, po prostu dodając zmienną lokalną "user"w kodzie serwera, ale chodzi o to, że chcę sprawdzić istnienie takich zmiennych w czasie wykonywania, używając codziennego wzorca typu if/else nullcheck. Wyjątek dla zmiennej, która nie istnieje, wydaje mi się śmieszny.

Author: Aashay Desai, 2011-03-21

10 answers

W ten sam sposób, w jaki zrobiłbyś to z czymkolwiek w js, typeof foo == 'undefined', lub ponieważ "locals" to nazwa obiektu, który je zawiera, możesz to zrobić if (locals.foo). To tylko raw js: P

 103
Author: tjholowaychuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-31 16:10:24

Spróbuj dodać zmienną z locals

Przykład: if(locals.user){}

 12
Author: spencer.sm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-24 07:43:23

Aby sprawdzić, czy użytkownik jest zdefiniowany, musisz to zrobić:

<% if (this.user) { %>
   here, user is defined
<% } %>
 11
Author: HenioJR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-19 14:22:48

Możesz utworzyć widok helper, który sprawdza "obj = = = void 0", ten jest dla 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;
}

Następnie użyj go w widoku jak

<%- get('deep.nested.non.existent.value') %>  //returns: null
<%- get('deep.nested.non.existent.value', "default value") %> //returns: default value
 10
Author: Paulius Uza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-21 16:11:21
<% if (locals.user) { %>

 // Your logic goes here 

<% } %>
 8
Author: Anirudh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-11 14:08:32

Natknąłem się na ten sam problem używając node.js z mongoose / express / ejs podczas tworzenia relacji pomiędzy 2 zbiorami razem z Mongoose ' s populate (), w tym przypadku admins.user_id/ Align = "left" /
Więc nie mogłem znaleźć dlaczego:

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

Nie powiodło się z "Cannot read property' name ' Of null" Potem zauważyłem, że muszę zrobić sprawdzenie w ten sposób:

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

Musiałem sprawdzić "kontener" 'nazwa', więc zadziałało!
Potem, to działało tak samo:

if ( !users.user_id ) ...  
Mam nadzieję, że to pomoże.
 5
Author: aesede,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-17 21:50:34

Do twojego if Oświadczenia musisz użyć typeof:

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

<% } %>
 1
Author: Fabien Thetis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-18 19:16:55

To, co robię, to po prostu przekazać domyślny obiekt, który nazywam "data" = " i przekazać go do wszystkich moich szablonów ejs. Jeśli chcesz przekazać prawdziwe dane do szablonu ejs, dodaj je jako właściwość obiektu "data".

W ten sposób obiekt' data 'jest zawsze zdefiniowany i nigdy nie otrzymasz niezdefiniowanego Komunikatu o błędzie, nawet jeśli właściwość 'data' istnieje w szablonie ejs, ale nie w trasie node express.

 0
Author: Robert Brax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-13 13:18:12

Miałem ten sam problem i na szczęście odkryłem, że w JS jest również funkcja zwarcia (wiedziałem, że jest taka w Rubim i kilku innych językach).

Po mojej stronie serwera / kontrolera (to jest z Node.js / Express):

return res.render('result', {survey_result : req.session.survey_result&&req.session.survey_result.survey }); 
Widzisz, co tam zrobiłem? & & , Które następuje po potencjalnie niezdefiniowanej zmiennej (np. request.session.survey_result object, który może lub nie może mieć danych formularza) jest zapisem zwarciowym w JS. To, co robi, to Tylko ocena części, która następuje po&&, jeśli część po lewej stronie & & nie jest niezdefiniowane. Nie powoduje również błędu, gdy lewa część to undefined. Po prostu to ignoruje.

Teraz, w moim szablonie (pamiętaj, że przekazałem obiekt req.session.survey_result_survey obiekt do mojego widoku jako survey_result), a następnie renderowałem pola jako:

<table>
    <tr>
        <td> Name:</td>
        <td> <%=survey_result&&survey_result.name%></td>
    </tr>
    <tr>
        <td> Dojo Location:</td>
        <td> <%=survey_result&&survey_result.dojo_loc%></td>
    </tr>
    <tr>
        <td> Favourite Language:</td>
        <td> <%=survey_result&&survey_result.fave_lang%></td>
    </tr>

Użyłem tam również zwarcia, tylko dla bezpieczeństwa.

Kiedy próbowałem z wcześniej sugerowanych sposobów, po prostu:

<% if (typeof survey_result !== undefined) { %>
... <!-- some js and/or html code here -->
<% } %>

Czasami nadal próbowałby ocenić właściwości w IF oświadczenie...Może ktoś wyjaśni dlaczego?

Chciałem również poprawić, że undefined musi być bez pojedynczych cudzysłowów, jak widziałem w poprzednich przykładach. Ponieważ warunek nigdy nie będzie oceniany na true, ponieważ porównujesz Wartość ciągu znaków 'undefined' z typem danych undefined.

 0
Author: Yekatjarina Aljaksandrayna Shu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-15 22:53:00

Przyszedłem na tę stronę po odpowiedź, ale wymyśliłem krótszą składnię inline dla niej, która jest:

 <h2><%= user.name ? property.escrow.emailAddress : '' %></h2>
 0
Author: iMad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-31 23:32:37