اذهب إلى المحتوى

السؤال

نشر

لقد لاحظت وجود كل من app.render و res.render في node.js ولكن في التوثيق الرسمي التفاصيل لكل منهما متشابهة، وكل منها يستدعي callback. ما هو الفرق الأساسي بينهما وماهي الحالات التي يجب فيها استخدام كل واحدة؟

Recommended Posts

  • 1
نشر

إن res.render يعتمد على app.render ضمنياً، فهو ليس شيء منفصل أو جديد. ومن بعض الفروقات الأساسية بينهما:

  1. تستطيع استدعاء app.render على المستوى الأول (الجذر root) أما res.render حصراً ضمن وسيط أو مسار.
  2. يعيد app.render دوماً صفحة html ضمن callback أما res.render يعيد ذلك فقط في حال قمت بوضع callback كمعامل ثالث، أما في حال قمت باستدعاء res.render دون معامل ثالث أو callback، سيتم إرسال صفحة html إلى الزبون تلقائياً مع رسالة بالرمز 200. مثال:
//باستخدام app.render

app.render('index', {title: 'app.render example'}, function(err, html) {
    console.log(html)
});

//باستخدام res.render بدون المعامل الثالث
app.get('/home', function(req, res) {
    res.render('index', {title: 'res.render example'})
})

//باستخدام res.render مع معامل ثالث
app.get('/render', function(req, res) {
    res.render('index', {title: 'res.render example'}, function(err, html) {
        console.log(html);
        res.send('Hello');
    })
})

أما من ناحية الاستخدام فعادةً يتم استخدام app.render عند إجراء render للصفحة دون الحاجة لإرسالها إلى المستخدم من خلال http، مثل حالات قوالب البريد الالكتروني مثلاً وغيرها.

  • 0
نشر

يوجد عدة فروق بينهما استاذ باسل مثل:

  1. app يعمل فى الroot level بينما res لا يعمل الا فى الroute/middleware
  2. دالة app.render يجب ان تمدها بالcallback وتقم بارجاع الhtml المزود فيه, بينما res.render فإن هذا الأمر اختياري, يمكنك ان لا تمدها بالcallback وفي هذه الحالة سوف تقوم الnodejs بإرجاع status code 200
  • 0
نشر

فكر في app.render () كدالة مساعدة لتوليد سلاسل العرض المقدمة. يستخدم res.render () داخليًا app.render () لعرض طرق العرض.

الاختلاف هو  app.renderObject هو المسؤول الوحيد عن توليد views، ولكنه غير قادر على ارسال ال views لل client الشيفرة في الأسفل ستبين أكثر

res.render = function(view, locals, cb){
    app.render(view, locals, function(err, html){
        if(typeof cb !== 'undefined'){
            return cb(err, html);
        }
        res.send(html);
    });
};

 

  • 0
نشر (معدل)

المستندات الخاصة بـ app.render: تقوم بتقديم عرض مع رد اتصال  callback يستجيب مع السلسلة المقدمة. هذا هو المتغير على مستوى التطبيق لـ res.render () ، وبخلاف ذلك يتصرف بنفس الطريقة. أما المستندات لـ res.render: تقوم بتقديم عرض مع رد اتصال يستجيب مع السلسلة المقدمة. عند حدوث خطأ بعد ذلك ، يتم استدعاء  (err )next. عندما يتم توفير رد نداء ، يتم تمرير كل من الخطأ المحتمل والسلسلة المقدمة ، ولا يتم تنفيذ أي استجابة تلقائية كيف يمكنني معرفة متى أستخدم أيهما؟ فيما يلي بعض الاختلافات: يمكنك استدعاء app.render على مستوى الجذر و res.render داخل مسار / برمجية وسيطة فقط. يقوم app.render دائمًا بإرجاع html في وظيفة رد الاتصال ، بينما يقوم res.render بذلك فقط عندما تحدد وظيفة رد الاتصال كمعامل ثالث. إذا اتصلت بـ res.render بدون المعامل الثالث / وظيفة رد الاتصال ، فسيتم إرسال html المقدم إلى العميل برمز الحالة .

// app.render
app.render('index', {title: 'res vs app render'}, function(err, html) {
    console.log(html)
});
// logs the following string (from default index.jade)
<!DOCTYPE html><html><head><title>res vs app render</title><link rel="stylesheet" href="/stylesheets/style.css"></head><body><h1>res vs app render</h1><p>Welcome to res vs app render</p></body></html>
// res.render
// بدون الوسيط الثالث
app.get('/render', function(req, res) {
    res.render('index', {title: 'res vs app render'})
})
//لكنه يرسله للعميل index.jade يعرض أيضًا
//GET /render على text/html مع الحالة 200 والنص من نوع المحتوى
// res.render مع الوسيط الثالث
app.get('/render', function(req, res) {
    res.render('index', {title: 'res vs app render'}, function(err, html) {
        console.log(html);
        res.send('done');
    })
})
//index.jade  ويرسل "تم" إلى العميل بدلاً من ذلك من محتوى  app.render يسجل مثل

يستخدم res.render app.render داخليًا لتقديم ملفات القوالب. يمكنك استخدام وظائف التقديم لإنشاء رسائل بريد إلكتروني بتنسيق html. اعتماداً على هيكل التطبيق الخاص بك ، قد لا يكون لديك دائماً إمكانية الوصول إلى الكائن app .

// على سبيل المثال داخل مسار خارجي
// app.js
var routes = require('routes');
app.get('/mail', function(req, res) {
    // app object is available -> app.render
})
app.get('/sendmail', routes.sendmail);
// routes.js
exports.sendmail = function(req, res) {
    // can't use app.render -> therefore res.render
}

 

تم التعديل في بواسطة Ali Haidar Ahmad

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...