Di halaman github EJS, hanya ada satu contoh sederhana: https://github.com/visionmedia/ejs
Contoh
<% if (user) { %>
<h2><%= user.name %></h2>
<% } %>
Ini sepertinya memeriksa keberadaan variabel bernama pengguna, dan jika ada, lakukan beberapa hal. Duh kan?
Pertanyaan saya adalah, mengapa di dunia ini Node akan melempar ReferenceError jika variabel pengguna tidak ada? Ini membuat contoh di atas tidak berguna. Apa cara yang tepat untuk memeriksa keberadaan variabel? Apakah saya diharapkan untuk menggunakan mekanisme coba / tangkap dan mengambil ReferenceError itu?
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)
Saya memahami bahwa saya dapat membuat kesalahan ini hilang hanya dengan menambahkan variabel lokal "pengguna" di kode server saya, tetapi intinya di sini adalah bahwa saya ingin memeriksa keberadaan variabel tersebut pada waktu proses menggunakan if / else Anda setiap hari pola tipe nullcheck. Pengecualian untuk variabel yang tidak ada tampaknya konyol bagi saya.
alert
adalah bagian dari objek browserwindow
, dan tidak tersedia di node.js. Alternatifnya adalahconsole.log
, meskipun saya tidak tahu apakah itu tersedia dalam template ejs kecuali Anda meneruskannya melaluilocals
.if (locals.user){ }
FTWCoba persiapkan variabel dengan
locals
Contoh:
if(locals.user){}
sumber
sumber
Anda dapat membuat view helper yang memeriksa "obj === void 0", yang ini untuk express.js:
Kemudian gunakan dalam tampilan seperti
sumber
<%=
dan<%-
?<%=
HTML mengesampingkan nilai terlebih dahulu;<%-
mengeluarkan nilai yang tidak lolos. Jadi<b>
akan menjadi tag tebal saat menggunakan<%-
, tetapi cukup teks "<b>" saat menggunakan<%=
Untuk memeriksa apakah pengguna sudah ditentukan, Anda perlu melakukan itu:
sumber
foo
, klausul else masih dievaluasi. Diuji dengan EJS 2.3.4 EDIT: menggunakanlocals
di tempatthis
kerjaSaya telah menemukan masalah yang sama menggunakan node.js dengan mongoose / express / ejs saat membuat hubungan antara 2 koleksi bersama dengan mongoose's populate (), dalam hal ini admins.user_id ada tetapi terkait dengan users._id yang tidak ada.
Jadi, tidak dapat menemukan alasannya:
gagal dengan "Tidak dapat membaca properti 'nama' dari null" Kemudian saya perhatikan bahwa saya perlu melakukan pemeriksaan seperti ini:
Saya perlu memeriksa "wadah" dari 'nama', jadi itu berhasil!
Setelah itu, ini bekerja sama:
Semoga membantu.
sumber
Datang ke halaman ini untuk sebuah jawaban tetapi saya datang dengan sintaks sebaris yang lebih pendek untuk itu yaitu:
sumber
Untuk
if
pernyataan Anda, Anda perlu menggunakantypeof
:sumber
Apa yang saya lakukan hanyalah meneruskan objek default yang saya sebut 'data' = '' dan meneruskannya ke semua template ejs saya. Jika Anda perlu meneruskan data nyata ke template ejs, tambahkan sebagai properti objek 'data'.
Dengan cara ini, objek 'data' selalu didefinisikan dan Anda tidak pernah mendapatkan pesan kesalahan yang tidak ditentukan, bahkan jika properti 'data' ada di template ejs Anda tetapi tidak di rute ekspres node Anda.
sumber
Saya memiliki masalah yang sama, dan untungnya, saya menemukan bahwa ada juga fungsi sirkuit pendek di JS (saya tahu ada satu di Ruby dan beberapa bahasa lain).
Di sisi server / pengontrol saya (ini dari Node.js / Express):
Lihat apa yang saya lakukan di sana? && yang mengikuti setelah variabel yang mungkin tidak terdefinisi (yaitu
request.session.survey_result
objek, yang mungkin memiliki atau tidak memiliki data bentuk) adalah notasi hubung singkat di JS. Yang dilakukannya hanyalah mengevaluasi bagian yang mengikuti && jika bagian di sebelah kiri && TIDAK belum ditentukan. Itu juga tidak membuang kesalahan ketika bagian kiri ISundefined
. Itu hanya mengabaikannya.Sekarang, di templat saya (ingat bahwa saya meneruskan objek
req.session.survey_result_survey
objek ke view saya sebagaisurvey_result
) dan kemudian saya membuat bidang sebagai:Saya juga menggunakan arus pendek di sana, hanya untuk penyimpanan yang aman.
Ketika saya mencobanya dengan cara yang disarankan sebelumnya, cukup:
Kadang-kadang, ia masih mencoba mengevaluasi properti dalam pernyataan IF ... Mungkin seseorang dapat memberikan penjelasan mengapa?
Juga, saya ingin mengoreksi yang
undefined
perlu tanpa tanda kutip tunggal, seperti yang saya lihat dilakukan pada contoh sebelumnya. Karena kondisi tidak akan pernah mengevaluasitrue
, saat Anda membandingkan nilai String'undefined'
dengan tipe dataundefined
.sumber
Anda bisa menggunakan trik ini:
dimana ruang lingkup adalah objek induk pengguna
sumber
jika Anda berencana untuk sering menggunakan objek yang sama, Anda dapat menggunakan fungsi seperti ini:
pemakaian:
sumber
Saya telah menemukan solusi lain.
Saya harap ini membantu.
sumber