• 0

وضع خصائص إضافية في غرض Express Request باستخدام typescript في node.js

أحاول إضافة خصائص أخرى إلى الطلب req من خلال وسطاء middlewares باستخدام typescript، مثلاً بهذا الشكل:

app.use((req, res, next) => {
    req.newKey = setProperty(); 
    next();
});

بحيث يتم عبر typescript من خلال هذا الوسيط إضافة بعض القيم إلى الغرض req والوصول إليها ضمن التوابع الأخرى. كيف يمكنني تنفيذ مايشبه ذلك؟

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

في النسخ السابقة يمكنك كما تمت الإشارة في التعليق السابق تعريف متغيّر express عام لأي خصائص إضافية:

declare global {
  namespace Express {
    interface Request {
      context: Context
    }
  }
}

بحيث يصبح الكود الكامل عندما تريد استخدامه بالشكل التالي:

import * as express from 'express';

export class Context {
  constructor(public newVariable) {
  }

  log(message: string) {
    console.log(this.newVariable, { message });
  }
}

declare global {
  namespace Express {
    interface Request {
      context: Context
    }
  }
}

const app = express();

app.use((req, res, next) => {
  req.context = new Context(req.url);
  next();
});

app.use((req, res, next) => {
  req.context.log('returning from the context')
  res.send('Hi There!');
});

app.listen(5000, () => console.log('Server is listening on port: 5000'))

أما في النسخ الحديثة من express 4.17.1 وما فوق  أصبح يجب عليك استخدام وتضمين express-serve-static-core مع المودل بهذا الشكل:

import {Express} from "express-serve-static-core";

declare module 'express-serve-static-core' {
  interface Request {
    newProperty?: string
  }
  interface Response {
    anotherProperty?: string
  }

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

يجب عليك إنشاء تعريف مخصص ، واستخدام ميزة في Typescript تسمى دمج الإعلان Declaration Merging . هذا شائع الاستخدام ، على سبيل المثال في method-override.

قم بإنشاء ملف custom.d.ts وتأكد من إدراجه في ملفات tsconfig.json إن وجدت. يمكن أن تبدو المحتويات على النحو التالي:

declare namespace Express {
   export interface Request {
      tenant?: string
   }
}

سيسمح لك ذلك ، في أي مكان في الكود الخاص بك ، باستخدام شيء مثل هذا:

router.use((req, res, next) => {
    req.tenant = 'tenant-X'
    next()
})

router.get('/whichTenant', (req, res) => {
    res.status(200).send('This is your tenant: '+req.tenant)
})

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

نعم كتابة هذه الشيفرة 

app.use((req, res, next) => {
    req.newKey = setProperty(); 
    next();
});

سوف يظهر لك خط أحمر تحت newKey يحدد أن هناك خطأ ما وهو ببساطة لأن  الخاصية newKey غير موجودة في Express Request interface type ويمكنك اصلاح ذلك باظافتها.

أول شيء يتعين علينا القيام به هو إنشاء ملف إعلان جديد types> express> index.d.ts في جذر مشروعنا.

oz7p3nk25mcqd43czgc4.png.7165234a932400af780bb35c8456b9f9.png

 

بعد ذلك ، نحتاج إلى إجراء بعض التغييرات القليلة في ملف tsconfig.json الخاص بالمشروع. لنقم بتحديث قيمة typeRoots إلى ما يلي:

...
"typeRoots": [
      "@types",
      "./node_modules/@types",
    ]                    
...

بشكل افتراضي ، يبحث المحول البرمجي Typescript عن تعريفات الأنواع في مجلد node_modules / @ types. يوجه الكود أعلاه المترجم للبحث عن تعريفات النوع في هذا المجلد بالإضافة إلى مجلدtypes المخصص في جذر مشروعنا.

حان الوقت الآن لإضافة خاصية newKey المخصصة الخاصة بنا إلى نوع واجهة طلب Express عن طريق تعديل ملف index.d.ts الذي أنشأناه سابقًا:

declare global{
    namespace Express {
        interface Request {
            newKey: NewKey
        }
    }
}

 

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن