Tamim Fahed نشر 2 أغسطس 2021 أرسل تقرير نشر 2 أغسطس 2021 أحاول إضافة خصائص أخرى إلى الطلب req من خلال وسطاء middlewares باستخدام typescript، مثلاً بهذا الشكل: app.use((req, res, next) => { req.newKey = setProperty(); next(); }); بحيث يتم عبر typescript من خلال هذا الوسيط إضافة بعض القيم إلى الغرض req والوصول إليها ضمن التوابع الأخرى. كيف يمكنني تنفيذ مايشبه ذلك؟ 1 اقتباس
1 عبدالله عبدالرحمن11 نشر 2 أغسطس 2021 أرسل تقرير نشر 2 أغسطس 2021 يجب عليك إنشاء تعريف مخصص ، واستخدام ميزة في 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 اقتباس
1 Sam Ahw نشر 2 أغسطس 2021 أرسل تقرير نشر 2 أغسطس 2021 في النسخ السابقة يمكنك كما تمت الإشارة في التعليق السابق تعريف متغيّر 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 اقتباس
0 Salah Eddin Beriani2 نشر 2 أغسطس 2021 أرسل تقرير نشر 2 أغسطس 2021 نعم كتابة هذه الشيفرة app.use((req, res, next) => { req.newKey = setProperty(); next(); }); سوف يظهر لك خط أحمر تحت newKey يحدد أن هناك خطأ ما وهو ببساطة لأن الخاصية newKey غير موجودة في Express Request interface type ويمكنك اصلاح ذلك باظافتها. أول شيء يتعين علينا القيام به هو إنشاء ملف إعلان جديد types> express> index.d.ts في جذر مشروعنا. بعد ذلك ، نحتاج إلى إجراء بعض التغييرات القليلة في ملف 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 } } } اقتباس
السؤال
Tamim Fahed
أحاول إضافة خصائص أخرى إلى الطلب req من خلال وسطاء middlewares باستخدام typescript، مثلاً بهذا الشكل:
app.use((req, res, next) => { req.newKey = setProperty(); next(); });
بحيث يتم عبر typescript من خلال هذا الوسيط إضافة بعض القيم إلى الغرض req والوصول إليها ضمن التوابع الأخرى. كيف يمكنني تنفيذ مايشبه ذلك؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.