EJS टेम्प्लेट (ExpressJS का उपयोग करके) में चर के अस्तित्व की जांच करने का उचित तरीका क्या है?


121

EJS github पेज पर, एक और केवल एक सरल उदाहरण है: https://github.com/visionmedia/ejs

उदाहरण

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

ऐसा लगता है कि उपयोगकर्ता नाम के एक चर के अस्तित्व के लिए जाँच कर रहा है, और यदि यह मौजूद है, तो कुछ सामान करें। दुह, सही?

मेरा प्रश्न यह है कि यदि उपयोगकर्ता चर मौजूद नहीं है, तो दुनिया में Node एक संदर्भ संदर्भ क्यों फेंकेगा? यह उपरोक्त उदाहरण को बेकार कर देता है। चर के अस्तित्व की जांच करने का उपयुक्त तरीका क्या है? क्या मुझे एक कोशिश / कैच मैकेनिज्म का उपयोग करने और उस रेफरेंस को हड़पने की उम्मीद है?

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)

मैं समझता हूं कि मैं अपने सर्वर कोड में केवल "उपयोगकर्ता" स्थानीय चर जोड़कर इस त्रुटि को दूर कर सकता हूं, लेकिन यहां संपूर्ण बिंदु यह है कि मैं हर दिन अगर आप का उपयोग करते हुए रनवे पर ऐसे चर के अस्तित्व की जांच करना चाहता हूं / तो nullcheck प्रकार पैटर्न। एक चर के लिए एक अपवाद जो मौजूद नहीं है, मुझे हास्यास्पद लगता है।

जवाबों:


149

उसी तरह से आप इसे js में किसी भी चीज़ के साथ करेंगे typeof foo == 'undefined', या चूंकि "लोकल" उन ऑब्जेक्ट का नाम है, जो आप कर सकते हैं if (locals.foo)। यह सिर्फ कच्चा जेएस है: पी


3
मुझे आश्चर्य हो रहा है कि क्या मुझे अपने हाथों पर बड़ी समस्या है। यह एक संदर्भ त्रुटि भी फेंकता है: <% चेतावनी ('परीक्षण'); %>
अक्षय देसाई

1
@ आकाश alertब्राउज़र की windowवस्तु का हिस्सा है , और नोड में उपलब्ध नहीं है। विकल्प यह है console.log, हालांकि मुझे नहीं पता कि यह ईजेएस टेम्पलेट में उपलब्ध है जब तक कि आप इसे अंदर से नहीं पास करते locals
Zikes

2
@Zikes इस मामले में मैं विशेष रूप से ईजेएस के लिए देख रहा हूं, इसलिए यह ब्राउज़र पेज पर है। लेकिन, जैसे टीजे ने कहा, टाइपो फू == 'अपरिभाषित' काम करता है। मैंने सीखा कि मैं एक साधारण जोड़ सकता हूं !! फू अगर फू को परिभाषित किया गया है, लेकिन अशक्त या खाली है।
अक्षय देसाई

21
क्या इसके लिए कोई आशुलिपि है? EJS केवल (foo) मामले का सम्मान क्यों नहीं करता है?
Mattdlockyer

5
if (locals.user){ }FTW
s2t2

26

वेरिएबल को पहले से तैयार करने का प्रयास करें locals

उदाहरण: if(locals.user){}



13

आप एक व्यू हेल्पर बना सकते हैं जो "obj === void 0" की जांच करता है, यह एक एक्सप्रेस के लिए है। 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

3
यकीन नहीं हो रहा था कि यह क्यों नकारा गया, मेरी राय में यह बहुत खूबसूरत था।
जॉइस

बीच क्या अंतर है <%=और <%-?
नोबल उत्थान

2
@NobleUplift प्रलेखन के अनुसार , "टैग" के तहत: <%=HTML पहले मूल्य से बच जाता है; <%-अनपेक्षित मान को आउटपुट करता है। तो <b>उपयोग करते समय एक बोल्ड टैग बन जाएगा <%-, लेकिन बस पाठ "<b>" का उपयोग करते समय<%=
Matheus Avellar

धन्यवाद! मुझे पता नहीं था <% - एक वैध टैग भी था।
नोबल उत्थान

13

यह जाँचने के लिए कि उपयोगकर्ता परिभाषित है, आपको यह करने की आवश्यकता है:

<% if (this.user) { %>
   here, user is defined
<% } %>

3
यह सबसे अप-टू-डेट ईजेएस लाइब्रेरी (1.0.0) में काम नहीं करता है। यद्यपि मान्य जावास्क्रिप्ट, EJS अपेक्षित रूप से कार्य करने से इंकार करेगा।
एक्सोरेन

5
मेरे लिए काम नहीं करता है। हालांकि मैंने परिभाषित किया है foo, फिर भी अन्य खंड का मूल्यांकन किया जाता है। EJS 2.3.4 EDIT के साथ परीक्षण किया गया: कार्य की localsजगह का उपयोग करनाthis
X_Trust

8

मैं उसी मुद्दे पर आया हूं, जो mongoose / populate () के साथ एक साथ 2 संग्रह के बीच संबंध बनाते समय mongoose / express / ejs के साथ नोड का उपयोग करता है। इस मामले में Adins.user_id मौजूद था, लेकिन एक अनुभवहीन उपयोगकर्ताओं से संबंधित था ।_id
तो, क्यों नहीं मिल सका:

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

"अशक्त की संपत्ति का नाम नहीं पढ़ सकता" के साथ असफल रहा था "तो मैंने देखा कि मुझे इस तरह की जाँच करने की आवश्यकता थी:

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

मुझे 'नाम' के "कंटेनर" की जांच करने की आवश्यकता थी, इसलिए इसने काम किया!
उसके बाद, इसने वही काम किया:

if ( !users.user_id ) ...  

आशा करता हूँ की ये काम करेगा।


वैसे भी, ईजेएस पर इतने कम आधिकारिक दस्तावेज़ों पर विश्वास नहीं किया जा सकता है ... वे 2010 के बाद से अपने प्रलेखन को अपडेट नहीं करते हैं !!!
14

3

एक उत्तर के लिए इस पृष्ठ पर आया था, लेकिन मैं इसके लिए एक छोटी इनलाइन वाक्य रचना के साथ आया था जो है:

 <h2><%= user.name ? property.escrow.emailAddress : '' %></h2>

1
यह उपयोग करने के लिए खतरनाक है, क्योंकि यदि ऑब्जेक्ट 'उपयोगकर्ता' के पास 'नाम' संपत्ति नहीं है, तो ईजेएस प्रतिपादन विफल हो जाएगा।
मार्को रोशेवस्की


0

मैं जो कुछ करता हूं वह केवल एक डिफ़ॉल्ट ऑब्जेक्ट है जिसे मैं 'डेटा' = '' कहता हूं और इसे मेरे सभी ईजेएस टेम्प्लेट में पास करता हूं। यदि आपको वास्तविक डेटा को ईजेएस टेम्पलेट में पास करने की आवश्यकता है, तो उन्हें 'डेटा' ऑब्जेक्ट की संपत्ति के रूप में जोड़ें।

इस तरह, 'डेटा' ऑब्जेक्ट हमेशा परिभाषित होता है और आपको कभी भी अपरिभाषित त्रुटि संदेश नहीं मिलता है, भले ही 'डेटा' की संपत्ति आपके ईजेएस टेम्पलेट में मौजूद हो, लेकिन आपके नोड एक्सप्रेस रूट में नहीं।


0

मेरे पास एक ही मुद्दा था, और सौभाग्य से, मैंने पाया कि जेएस में एक शॉर्ट-सर्किट फ़ंक्शन भी है (मुझे पता था कि रूबी और कुछ अन्य भाषाओं में एक था)।

मेरे सर्वर / नियंत्रक पक्ष पर (यह Node.js / एक्सप्रेस से है):

return res.render('result', {survey_result : req.session.survey_result&&req.session.survey_result.survey }); 

देखो, वहां मैंने क्या किया था? && जो संभवतः अपरिभाषित चर (यानी request.session.survey_resultऑब्जेक्ट, जिसमें डेटा हो सकता है या नहीं हो सकता है) के बाद अनुसरण करता है , जेएस में शॉर्ट-सर्किट नोटेशन है। यह जो करता है वह केवल उस भाग का मूल्यांकन करता है जो && के बाईं ओर का भाग अपरिभाषित नहीं होता है। यह भी एक त्रुटि नहीं फेंकता है जब बायां भाग आईएस undefined। यह सिर्फ इसकी अनदेखी करता है।

अब, मेरे टेम्पलेट में (याद रखें कि मैंने ऑब्जेक्ट req.session.survey_result_surveyऑब्जेक्ट को मेरे विचार के रूप में पारित कर दिया है survey_result) और फिर मैंने फ़ील्ड्स को निम्न रूप में प्रस्तुत किया:

<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>

मैंने वहां शॉर्ट-सर्किट का भी इस्तेमाल किया, सिर्फ सुरक्षित रखने के लिए।

जब मैंने इसे पहले सुझाए गए तरीकों से आज़माया, तो बस:

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

कभी-कभी, यह अभी भी IF कथन के भीतर गुणों का मूल्यांकन करने का प्रयास करेगा ... शायद कोई व्यक्ति स्पष्टीकरण प्रस्तुत कर सकता है कि क्यों?

इसके अलावा, मैं undefinedएकल उद्धरणों के बिना होना चाहिए, जैसा कि मैंने पिछले उदाहरणों में देखा था, इसे ठीक करना चाहता था । क्योंकि स्थिति कभी भी मूल्यांकन नहीं करेगी true, क्योंकि आप एक स्ट्रिंग मूल्य की तुलना 'undefined'डेटाटाइप से कर रहे हैं undefined


0

आप इस ट्रिक का उपयोग कर सकते हैं:

user.name // stops code execution,if user is undefined
(scope.user||0).name // === undefined

जहां गुंजाइश उपयोगकर्ता की मूल वस्तु है


0

यदि आप अक्सर एक ही वस्तु का उपयोग करने की योजना बनाते हैं, तो आप इस तरह से एक फ़ंक्शन का उपयोग कर सकते हैं:

<% function userObj(obj){
    //replace user with what you name your object
    if(typeof user === 'object'){
        let result = user;
        if(obj){
            obj = obj.split('.');
            for(let i = 0; i < obj.length; i++){
                if(obj[i] && obj[i].trim() !== '' && result[obj[i]]){
                    result = result[obj[i]];
                }else{
                    result = false;
                    break;
                }
            }
        }
        return result;
    }
    return false;
} %>

उपयोग:

<% if(userObj('name')){
    <h2><%= userObj('name') %></h2>
} %>

0

मैं एक और समाधान लेकर आया हूं।

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

आशा है कि ये आपकी मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.