কোন ইজেএস টেমপ্লেটে (এক্সপ্রেসজেএস ব্যবহার করে) ভেরিয়েবলের অস্তিত্বের জন্য সঠিক উপায় কী?


121

ইজেএস গিথুব পৃষ্ঠায়, একটি এবং একটি সহজ উদাহরণ রয়েছে: https://github.com/visionmedia/ejs

উদাহরণ

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

মনে হচ্ছে এটি একটি পরিবর্তনশীল নামের ব্যবহারকারীর অস্তিত্বের জন্য যাচাই করে নিচ্ছে এবং যদি এটি উপস্থিত থাকে তবে কিছু স্টাফ করুন। দুহ, তাই না?

আমার প্রশ্ন হ'ল যদি ব্যবহারকারী ভেরিয়েবলের অস্তিত্ব না থাকে তবে নোড কেন বিশ্বে একটি রেফারেন্সআরার নিক্ষেপ করবে? এটি উপরোক্ত উদাহরণটিকে অকেজো উপস্থাপন করে। একটি ভেরিয়েবলের অস্তিত্ব পরীক্ষা করার উপযুক্ত উপায় কী? আমি কি চেষ্টা / ধরার ব্যবস্থাটি ব্যবহার করার এবং সেই রেফারেন্স এরিয়ারটি ধরার আশা করব?

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)

আমি বুঝতে পারি যে আমি আমার সার্ভার কোডে কেবলমাত্র "ব্যবহারকারী" স্থানীয় ভেরিয়েবল যুক্ত করে এই ত্রুটিটি সরিয়ে দিতে পারি, তবে এখানে পুরো বিষয়টি হ'ল আমি যদি আপনার প্রতিদিন ব্যবহার করে রানটাইমের সময় এই ধরণের ভেরিয়েবলগুলির অস্তিত্ব পরীক্ষা করতে চাই তবে / অন্যথায় নাল চেক টাইপ প্যাটার্ন। যে চলকটির অস্তিত্ব নেই তার ব্যতিক্রম আমার কাছে হাস্যকর মনে হয়।

উত্তর:


149

আপনি যেভাবে যে কোনও কিছু দিয়ে এটি করতে পারবেন typeof foo == 'undefined', বা যেহেতু "স্থানীয়রা" এগুলি সম্বলিত বস্তুর নাম, তাই আপনি এটি করতে পারেন if (locals.foo)। এটি কেবল কাঁচা জেএস: পি


3
আমি ভাবতে শুরু করি যে আমার হাতে আরও বড় সমস্যা হয়েছে কিনা। এটি একটি রেফারেন্স ত্রুটিও ছুঁড়ে ফেলেছে: <% সতর্কতা ('পরীক্ষা'); %>
আশায় দেশাই

1
@ আশয় alertএকটি ব্রাউজারের windowঅবজেক্টের অংশ , এবং নোড.জেএস এ উপলব্ধ নয় বিকল্পটি হ'ল console.log, যদিও আমি জানিনা এটি ইজএস টেমপ্লেটে পাওয়া যায় না যদি না আপনি এটি দিয়ে যান locals
জাইক্স 23'11

2
@ জাইকস এই ক্ষেত্রে আমি বিশেষত ইজেএস খুঁজছি, তাই এটি ব্রাউজার পৃষ্ঠায় page তবে, টিজে বলেছিলেন, টাইপফু ফু == 'অপরিজ্ঞাত' কাজ করে। আমি শিখেছি যে আমি ফুও সংজ্ঞায়িত করা হয়েছে তবে শূন্য বা খালি থাকলে একটি সরল !!
আশায় দেশাই

21
এর জন্য কি কোনও শর্টহ্যান্ড আছে? ইজেএস কেন কেবল (ফু) ক্ষেত্রে সম্মান দেয় না?
ম্যাটডলকায়ার

5
if (locals.user){ }FTW
s2t2

26

এর সাথে ভেরিয়েবল প্রেন্ডিং করার চেষ্টা করুন locals

উদাহরণ: if(locals.user){}



13

আপনি একটি ভিউ হেল্পার তৈরি করতে পারেন যা "اعتراض === শূন্য 0" এর জন্য পরীক্ষা করে, এটি এক্সপ্রেস.জেএস এর জন্য:

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
নিশ্চিত হলেন না কেন এটি হ্রাস পেয়েছে, এটি আমার মতে বরং মার্জিত।
জোসিয়াম

মধ্যে পার্থক্য কি <%=এবং <%-?
NobleUplift

2
@ NobleUplift ডকুমেন্টেশন অনুসারে , "ট্যাগ্স" এর অধীনে: <%=এইচটিএমএল প্রথমে মানটিকে ছাড়িয়ে যায়; <%-অপরিশোধিত মানকে আউটপুট করে। সুতরাং <b>এটি ব্যবহারের সময় একটি সাহসী ট্যাগ হয়ে উঠবে <%-, তবে কেবল "<b>" টেক্সটটি ব্যবহার করার সময়<%=
ম্যাথিউস অ্যাভেলার 18

ধন্যবাদ! আমার কোনও ধারণা ছিল না <% - এমনকি একটি বৈধ ট্যাগ ছিল।
NobleUplift

13

ব্যবহারকারীর সংজ্ঞা দেওয়া আছে কিনা তা পরীক্ষা করতে আপনার এটি করা দরকার:

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

3
এটি সর্বশেষতম ইজেএস লাইব্রেরিতে (1.0.0) কাজ করে না। বৈধ জাভাস্ক্রিপ্ট হওয়া সত্ত্বেও, ইজেএস প্রত্যাশা অনুযায়ী কাজ করতে অস্বীকার করবে।
অ্যাকোরেন

5
আমার জন্য কাজ করে না। যদিও আমি সংজ্ঞায়িত করেছি foo, অন্যথায় ধারাটি এখনও মূল্যায়ন করা হয়। localsthis
EJS 2.3.4 EDIT-

8

আমি মুংগস / এক্সপ্রেস / ইজেস সহ নোড.জেএস ব্যবহার করে একই সংখ্যার মুখোমুখি হয়েছি যখন মঙ্গুজের জনসংখ্যা () এর সাথে ২ টি সংগ্রহের মধ্যে একসাথে সম্পর্ক তৈরি করেছি, এই ক্ষেত্রে অ্যাডমিন.ইউজার_আইডি বিদ্যমান ছিল তবে এটি একটি অনভিজ্ঞ ব্যবহারকারীদের সাথে সম্পর্কিত ছিল __আইডি।
সুতরাং, কেন খুঁজে পেল না:

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

"নালীর সম্পত্তি 'নাম' পড়তে পারছি না" এর সাথে ব্যর্থ হচ্ছিল তখন আমি লক্ষ্য করেছি যে আমাকে এইভাবে চেকিং করা দরকার:

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

আমার 'নামের' ধারকটি পরীক্ষা করা দরকার, তাই এটি কাজ করেছিল!
এর পরে, এটি একই কাজ করেছে:

if ( !users.user_id ) ...  

আশা করি এটা সাহায্য করবে.


যাইহোক, ইজেএস-তে এতগুলি সরকারী দস্তাবেজ বিশ্বাস করতে পারে না ... তারা তাদের ডকুমেন্টেশনগুলি ২০১০ সাল থেকে আপডেট করে না !!!
aesde

3

উত্তরের জন্য এই পৃষ্ঠায় এসেছিল তবে আমি এর জন্য একটি সংক্ষিপ্ত ইনলাইন সিনট্যাক্স নিয়ে এসেছি যা হ'ল:

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

1
এটি ব্যবহার করা বিপজ্জনক, কারণ যদি অবজেক্টের 'ব্যবহারকারীর' কোনও 'নাম' সম্পত্তি না থাকে তবে ইজ রেন্ডারিং ব্যর্থ হবে।
মার্কো রোচেভস্কি


0

আমি যা করি তা হ'ল আমি একটি ডিফল্ট অবজেক্টকে পাস করি যা আমি 'ডেটা' = '' কল করি এবং এটি আমার সমস্ত টেমপ্লেটগুলিতে প্রেরণ করি। আপনার যদি ejs টেমপ্লেটে আসল ডেটা পাস করার প্রয়োজন হয় তবে তাদের 'ডেটা' অবজেক্টের সম্পত্তি হিসাবে যুক্ত করুন।

এই উপায়ে, 'ডেটা' অবজেক্টটি সর্বদা সংজ্ঞায়িত হয় এবং আপনি কখনই অপরিজ্ঞাত ত্রুটি বার্তা পাবেন না, এমনকি যদি আপনার ejs টেম্পলেটে 'ডেটা'র সম্পত্তি বিদ্যমান থাকে তবে আপনার নোড এক্সপ্রেস রুটে নয়।


0

আমার একই সমস্যা ছিল এবং ভাগ্যক্রমে, আমি দেখতে পেলাম যে জেএসেও একটি শর্ট সার্কিট ফাংশন রয়েছে (আমি জানতাম রুবি এবং কিছু অন্যান্য ভাষায় একটি ছিল)।

আমার সার্ভার / নিয়ামক পক্ষের (এটি নোড.জেএস / এক্সপ্রেস থেকে):

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

কখনও কখনও, এটি এখনও আইএফ স্টেটমেন্টের মধ্যে থাকা বৈশিষ্ট্যগুলি মূল্যায়নের চেষ্টা করবে ... সম্ভবত কেউ কেন একটি ব্যাখ্যা দিতে পারে কেন?

এছাড়াও, আমি এটি সংশোধন করতে চেয়েছিলাম যা 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>
<%}}%>

আশা করি এটা কাজে লাগবে.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.