Na stronie github EJS jest jeden i tylko jeden prosty przykład: https://github.com/visionmedia/ejs
Przykład
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
Wygląda na to, że sprawdza istnienie zmiennej o nazwie user, a jeśli istnieje, zrób coś. Duh, prawda?
Moje pytanie brzmi: dlaczego na świecie Node miałby wyrzucać ReferenceError, jeśli zmienna użytkownika nie istnieje? To sprawia, że powyższy przykład jest bezużyteczny. Jaki jest właściwy sposób sprawdzania istnienia zmiennej? Czy mam użyć mechanizmu try / catch i pobrać ten błąd 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 mógłbym usunąć ten błąd, po prostu dodając zmienną lokalną „user” w kodzie mojego serwera, ale chodzi o to, że chcę sprawdzić istnienie takich zmiennych w czasie wykonywania, używając każdego dnia, jeśli / else wzorzec typu nullcheck. Wyjątek dla zmiennej, która nie istnieje, wydaje mi się śmieszny.
alert
jest częścią obiektu przeglądarkiwindow
i nie jest dostępne w node.js. Alternatywą jestconsole.log
, chociaż nie wiem, czy jest dostępny w szablonie ejs, chyba że przekażesz go przezlocals
.if (locals.user){ }
FTWSpróbuj poprzedzić zmienną
locals
Przykład:
if(locals.user){}
źródło
źródło
Możesz utworzyć pomocnika widoku, który sprawdza „obj === void 0”, ten jest przeznaczony dla express.js:
Następnie użyj go w widoku jak
źródło
<%=
i<%-
?<%=
HTML zmienia znaczenie jako pierwszy;<%-
wyświetla wartość bez zmiany znaczenia. Tak więc<b>
podczas używania stałoby się pogrubioną etykietą<%-
, ale po prostu tekst „<b>” podczas używania<%=
Aby sprawdzić, czy użytkownik jest zdefiniowany, musisz to zrobić:
źródło
foo
, klauzula else jest nadal oceniana. Testowane z EJS 2.3.4 EDIT: używanielocals
zamiastthis
pracyNatknąłem się na ten sam problem, używając node.js z mongoose / express / ejs podczas tworzenia relacji między 2 kolekcjami razem z populate () z mongoose, w tym przypadku admins.user_id istniał, ale był powiązany z nieistniejącym użytkownikiem ._id.
Nie mogłem więc znaleźć powodu:
wystąpił błąd „Nie można odczytać nazwy właściwości” o wartości null ”Następnie zauważyłem, że muszę sprawdzić, jak to zrobić:
Musiałem sprawdzić „kontener” „name”, więc zadziałało!
Potem zadziałało tak samo:
Mam nadzieję, że to pomoże.
źródło
Przyszedłem na tę stronę, aby uzyskać odpowiedź, ale wymyśliłem krótszą składnię wbudowaną, która jest:
źródło
Do swojego
if
oświadczenia musisz użyćtypeof
:źródło
Po prostu przekazuję domyślny obiekt, który nazywam 'data' = '' i przekazuję 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 Twojej trasie ekspresowej węzła.
źródło
Miałem ten sam problem i na szczęście odkryłem, że w JS jest również funkcja zwarcia (wiedziałem, że jest w Rubim i kilku innych językach).
Po stronie mojego serwera / kontrolera (pochodzi z Node.js / Express):
Widzisz co zrobiłem? Znak &&, który występuje po prawdopodobnie niezdefiniowanej zmiennej (tj.
request.session.survey_result
Obiekcie, który może mieć dane formularza lub nie) to notacja zwarcia w JS. Ocenia tylko część następującą po znaku &&, jeśli część po lewej stronie znaku && NIE jest niezdefiniowana. Nie zgłasza również błędu, gdy lewa część JESTundefined
. Po prostu to ignoruje.Teraz w moim szablonie (pamiętaj, że przekazałem obiekt
req.session.survey_result_survey
obiekt do mojego widoku jakosurvey_result
), a następnie wyrenderowałem pola jako:Tam też zastosowałem zwarcie, tylko dla pewności.
Kiedy wypróbowałem to z wcześniej sugerowanymi sposobami, po prostu:
Czasami nadal próbowałby ocenić właściwości w wyrażeniu IF ... Może ktoś może zaoferować wyjaśnienie, dlaczego?
Chciałem również poprawić to,
undefined
aby nie było pojedynczych cudzysłowów, jak widziałem w poprzednich przykładach. Ponieważ warunek nigdy nie da wartościtrue
, ponieważ porównujesz wartość typu String'undefined'
z typem danychundefined
.źródło
Możesz użyć tej sztuczki:
gdzie zakres jest obiektem nadrzędnym użytkownika
źródło
jeśli planujesz często używać tego samego obiektu, możesz użyć takiej funkcji:
stosowanie:
źródło
Mam inne rozwiązanie.
Mam nadzieję, że to pomoże.
źródło