جافاسكريبت - فهم كيفية استخدام NodeJS لإنشاء واجهة خلفية بسيطة


لقد كنت أحاول تطوير خادم بسيط نسبيًا في Node.js. في الأساس، ما أسعى إليه هو واجهة برمجة تطبيقات بسيطة تتطلب مصادقة (نمط اسم مستخدم/كلمة مرور بسيط). ما لا أحتاجه هو أي نوع من وظائف الواجهة الأمامية (التصميم بالقوالب وغيرها). مشكلتي هي أنني لا أستطيع أن أفهم نهج Express/Node.

بالتحديد، أسئلتي هي:

  • كيف أقوم بتوصيل المصادقة؟ هل أرسل عدة معالجات لكل مسار يتطلب المصادقة، أم أن هناك طريقة أكثر أناقة للقيام بذلك؟
  • كيف تعمل وسائط Express (مثل app.use(express.bodyParser())request أو response؟ على وجه التحديد، إذا استخدمت محلل الجسم (داخليًا formidable؟)، أين يمكنني الوصول إلى بيانات الطلب التي من المفترض أن يقوم بتحليلها؟
  • عند استخدام المصادقة ولدي، على سبيل المثال، بيانات اعتماد مخزنة في قاعدة بيانات مع مزيد من المعلومات عن العميل الفردي المرتبط، في أي نقطة أستخرج تلك المعلومات؟ أي، عند تسجيل دخول المستخدم، هل أقوم بجلب سجل المستخدم عند تسجيل الدخول وتمريره، أم أقوم بجلبه في كل معالج يحتاج إلى هذه المعلومات؟
  • في نهاية المطاف، هل تعرف أي تطبيق مفتوح المصدر يمكنني الاطلاع عليه؟ أود أن أرى شيئًا يحتوي على مصادقة بسيطة وربما يستخدم formidable، حيث أن رفع ملف هو أحد متطلباتي.

كما ذكرت سابقًا، أعتقد أن مشكلتي في النهاية هي صعوبة في النهج المعتمد على الدوال في Node (أيضًا، خبرتي في برمجة خدمات الويب محدودة إلى حد ما). إذا كنت تعرف مصدرًا يمكنني قراءته حول كيفية الاقتراب من هندسة تطبيق Node.js، الرجاء عدم التردد في توجيهي إليه.

الإجابة رقم 1

كيف أقوم بتوصيل المصادقة؟ هل أمرر عدة معالجات لكل مسار يتطلب المصادقة، أم أن هناك طريقة أكثر أناقة للقيام بذلك؟

يجب عليك استخدام وسيط الجلسة. إليك بعض الشيفرة الوهمية:

var http = require('http');
var app = express();

var authorize = function(req, res, next) {
    if(req.session && req.session.appname && req.session.appname === true) {
        // redirect to login page
        return;
    }
    next();
}

app.use(express.session());
app.all('/admin*', authorize, function(req, res, next) {

});

كيف يعمل الـ Express middleware (مثل app.use(express.bodyParser()))؟ هل يقومون بتغيير محتويات كائن الطلب أو الاستجابة؟ بشكل محدد، إذا استخدمت محلل الجسم (body parser) (داخليًا formidable؟)، أين يمكنني الوصول إلى بيانات الطلب التي من المفترض أن يقوم بتحليلها؟

كل وسيط لديه وصول إلى كائن الطلب والاستجابة. لذا، نعم، هو يعدله. عادةً ما يُلحق به خصائص. هذا يعني أنه داخل معالجك (الذي هو أيضًا وسيط) قد تكتب:

if(req.body && req.body.formsubmitted && req.body.formsubmitted === 'yes') {
    var data = {
        title: req.body.title,
        text: req.body.text,
        type: req.body.type
    }
    // store the data
}

عند استخدام المصادقة ولدي، على سبيل المثال، بيانات اعتماد مخزنة في قاعدة بيانات مع مزيد من المعلومات حول العميل الفردي المرتبط، في أي نقطة أقوم باستخراج تلك المعلومات؟ أي، عند تسجيل المستخدم الدخول، هل أقوم بجلب سجل المستخدم عند تسجيل الدخول وتمريره، أم أقوم بجلبه في كل معالج يتطلب المعلومات؟

أعتقد أنه يجب عليك القيام بالأشياء بنفس الطريقة كما في أي لغة على جانب الخادم الأخرى. احتفظ بحالة المستخدم (مسجل الدخول/غير مسجل الدخول) داخل جلسة. يمكنك أيضًا الاحتفاظ بمعرف المستخدم واسترجاع البيانات له حسب ما تحتاج. هذا يعتمد على حالتك، لكن لديك القدرة على تخزين المعلومات مؤقتًا. لأن Node ليس مثل PHP على سبيل المثال، أعني أنه لا يتوقف عن العمل.

في النهاية، هل تعرف أي تطبيق مفتوح المصدر يمكنني الاطلاع عليه؟ أود أن أرى شيئًا يحتوي على مصادقة بسيطة وربما يستخدم Formidable أيضًا، حيث أن رفع ملف هو أحد متطلباتي.

نعم. كتبت مقالاً عن موقع ويب بسيط جداً بنظام MVC مع لوحة إدارة. هو متاح هنا. وكوده هنا.

الإجابة رقم 2

طريقة بسيطة لتنفيذ المصادقة (إذا لم ترغب في استخدام وحدات إضافية):

var checkAuth = function(req, res, next) {
  if(!req.session.user)
  {
    // Redirect to login form
    res.redirect("/login");
  }
  else
  {
    // Proceed to member's area
    next();
  }
};

app.get("/member/page", checkAuth, function(req, res) {
  // render view, etc
});

bodyParser يحلل/يحوّل محتوى طلب POST إلى كائن، مما يساعد في الحصول على قيم إرسال النموذج.

يمكن للمسار الذي يعالج إرسال نموذج تسجيل الدخول الخاص بك الوصول إلى اسم المستخدم/كلمة المرور هكذا:

var username = req.body.username;
var password = req.body.password;

في هذه المرحلة، ستستعلم قاعدة البيانات الخاصة بك لاختيار المستخدمين حيث يطابق اسم المستخدم وكلمة المرور (ستحتاج إلى استخدام تشفير كلمة المرور في بيئة الإنتاج).

إذا حصلت على سجل في نتيجة الاستعلام، قم بتعيينه في الجلسة. طريقة بسيطة للقيام بذلك هي:

req.session.user = userRecord

(اضبط وفقًا لوسيط الجلسة الخاص بك)