تم توليد هذا المقال عبر أدوات الذكاء الاصطناعي (إصدار 4.0) لتقديم إجابة تقنية دقيقة ومباشرة.
يُعد خطأ TypeError: component.toJSON is not a function من الأخطاء الشائعة التي يواجهها مطورو بوتات Discord.js، خاصة عند التعامل مع المكونات (components) مثل الأزرار وقوائم الاختيار. يشير هذا الخطأ إلى أن الكائن الذي يتم تمريره كمكون لا يحتوي على الدالة toJSON المتوقعة، وهي ضرورية لـ Discord.js لتحويل المكونات إلى تنسيق يمكن إرساله إلى واجهة برمجة تطبيقات ديسكورد (Discord API). غالبًا ما يترافق هذا الخطأ مع رسائل تشير إلى "سطر غير معروف" أو "خطأ داخلي" ضمن مكتبة discord.js نفسها، مما يصعب عملية التصحيح.
تنشأ هذه المشكلة بشكل أساسي عندما لا يتم بناء المكونات بشكل صحيح أو لا تكون من النوع المتوقع بواسطة discord.js. تتوقع المكتبة كائنات محددة تمثل صفوف الإجراءات (Action Rows) التي تحتوي بدورها على أزرار أو قوائم اختيار. إذا تم تمرير كائن JavaScript عادي، أو كائن من فئة غير صحيحة، أو حتى تنسيق بيانات غير متوافق، فستفشل عملية التحويل هذه.
الأسباب الجذرية للخطأ:
- بنية المكون غير صالحة: يجب أن تكون المكونات عبارة عن مصفوفة من صفوف الإجراءات (
Action Rows). كل صف إجراء يجب أن يكون كائنًا من نوعActionRowBuilder(فيdiscord.js v13+) أوMessageActionRow(في الإصدارات الأقدم)، ويحتوي بدوره على كائناتButtonBuilderأوSelectMenuBuilder. تمرير كائنات JavaScript عادية أو سلاسل نصية مباشرة سيؤدي إلى هذا الخطأ. - الخلط بين أنواع المكونات: لا يمكن لـ
ActionRowBuilderأن تحتوي إلا على أزرار أو قوائم اختيار. محاولة إضافة أنواع بيانات أخرى أو كائنات غير متوافقة ستفشل. - الاستخدام غير الصحيح لواجهة برمجة التطبيقات (API): تمرير المكونات إلى وسيطة خاطئة في دالة مثل
reply()أوsend()، أو عدم تغليفها في مصفوفة عندما تتوقع الدالة ذلك، يمكن أن يسبب المشكلة.
stack trace) الذي يشير إلى ملفات داخلية لـ discord.js (مثل util/APIMessage.js) غالبًا ما تعني أن الخطأ حدث أثناء محاولة المكتبة معالجة بيانات غير صالحة قدمها الكود الخاص بك. هذا لا يعني وجود خطأ في المكتبة نفسها، بل في كيفية استخدامك لها.
الحلول والممارسات الهندسية:
- استخدام منشئات المكونات (Builders) في Discord.js v13+:
لضمان التوافقية والصحة، استخدم الفئات المخصصة لبناء المكونات. هذه الفئات توفر واجهة برمجية واضحة وتضمن أن الكائنات الناتجة تحتوي على جميع الدوال والخصائص المطلوبة، بما في ذلك
toJSON.
لاحظ أنconst { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } = require('discord.js'); // إنشاء زر const primaryButton = new ButtonBuilder() .setCustomId('primary_button') .setLabel('اضغط هنا') .setStyle(ButtonStyle.Primary); // إنشاء صف إجراءات يحتوي على الزر const row = new ActionRowBuilder() .addComponents(primaryButton); // إرسال الرسالة مع المكونات message.reply({ content: 'هذه رسالة تحتوي على زر!', components: [row] // يجب أن تكون مصفوفة من ActionRowBuilder });componentsيجب أن تكون مصفوفة، حتى لو كان هناك صف واحد فقط. - التحقق من بنية المصفوفة:
تأكد دائمًا من أن الوسيطة
componentsهي مصفوفة من كائناتActionRowBuilder.// صحيح: message.reply({ components: [row1, row2] }); // خطأ: تمرير صف واحد مباشرة بدون مصفوفة message.reply({ components: row1 }); // خطأ: تمرير زر مباشرة message.reply({ components: [primaryButton] }); - تسجيل المكونات للمراجعة (Debugging):
قبل إرسال المكونات، قم بتسجيل هيكلها في وحدة التحكم باستخدام
console.log(). هذا يمكن أن يساعد في تحديد ما إذا كان الكائن الذي تحاول إرساله هو بالفعلActionRowBuilderأو كائن آخر غير متوقع.console.log(row); // تحقق من نوع الكائن console.log(Array.isArray(row)); // هل هو مصفوفة؟
ماذا يعني "TypeError: component.toJSON is not a function"؟
يعني هذا الخطأ أن الكائن الذي تم تمريره كمكون إلى discord.js لا يحتوي على الدالة toJSON() المطلوبة. هذه الدالة ضرورية لـ discord.js لتحويل الكائن إلى تنسيق JSON يمكن إرساله إلى واجهة برمجة تطبيقات ديسكورد. يحدث هذا عادةً عند تمرير كائن JavaScript عادي أو كائن من نوع غير صحيح بدلاً من مثيل ActionRowBuilder.
لماذا يظهر الخطأ على "سطر غير معروف" أو في ملفات داخلية لـ Discord.js؟
يحدث هذا لأن الخطأ الفعلي (تمرير مكون غير صالح) يحدث في الكود الخاص بك، ولكن الفشل في معالجة هذا المكون يظهر داخل الدوال الداخلية لـ discord.js التي تحاول تحويله. بما أن المكتبة لا تتوقع هذا النوع من البيانات، فإنها تفشل في نقطة لا يمكنها فيها تحديد مصدر الخطأ الأصلي في الكود الخاص بك بوضوح. الحل هو التأكد من أن المكونات التي تمررها صحيحة وسليمة.
المصدر:
صوان محور XYZ
شكر خاص لـ GEMINI وجمال الحزازي.