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

السؤال

نشر

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

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

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

Recommended Posts

  • 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
نشر

في النسخ السابقة يمكنك كما تمت الإشارة في التعليق السابق تعريف متغيّر 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
  }

 

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

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...